2009-09-08 4 views
1

C# 함수에 출력 매개 변수가 있으면 다음과 같이 지울 수 있습니다.발신자 (C#의)에서 "out"키워드의 목적은 무엇입니까?

private void f(out OutputParameterClass outputParameter); 

함수 호출시 매개 변수를 초기화 할 필요가 없음을 나타냅니다. 그러나이 함수를 호출 할 때 이라는 키워드를 반복해야합니다.

f(out outputParameter); 

이것이 무엇에 좋은지 궁금합니다. 함수 스펙의 일부를 반복해야하는 이유는 무엇입니까? 아는 사람 있나요?

답변

-1

내가 가진 가장 좋은 대답은 plinth에 의해 주석으로 게시했습니다 :

아웃의 반복에 대한 가장 중요한 이유/심판은 당신이 전화하는거야 함수가 다른 서명으로 리팩토링 도착하면, 컴파일 오류가 발생합니다. 가장 주목할 만하게, 매개 변수가 밖으로 나가는 경우에, 당신은 즉시 알 것이다.

-2

분명히하기 위해 out을 사용해야 할 것입니다. 메소드 서명을 보지 않고도 알 수 없다면.

+1

out과 ref 사이의 명확한 지정 차이로 인해 예제가 작동하지 않습니다. –

3

디자인 기능입니다. 그것은 불필요한 것이 분명하지만 가독성을 돕습니다.

27

당신이하고있는 일을 알고 있음을 의미합니다. 즉, out 매개 변수임을 인정하는 것입니다. 정말로 완전히 다른 동작이 자동으로 발생하기를 원하십니까? 그건 그렇고, ref에 대해서도 마찬가지입니다.

은 (당신은 또한에 의해 값 출력/심판 대에 기반 과부하 수 있습니다,하지만 난 그것을 권하고 싶지 않다.)

기본적으로, 당신은 (캡처되지) 로컬 변수를 가지고 있다면 당신은로 사용 non-out/ref 인수를 사용하면 해당 변수의 값이 메소드 내에서 변경되지 않는다는 것을 알 수 있습니다. (그 다음이 참조하는 오브젝트 내의 데이터가 변경 될 수있는 참조 형 변수이지만, 이들은 매우 다르다합니다.)

이 당신이 C++로받을 상황의 종류를 방지 어디 무의식적으로 참조로 패스 무엇인가, 하지만 그 값이 변하지 않았다고 가정하십시오 ...

+3

정확히. 변수가 수신자에 의해 무의식적으로 변경되면 큰 두통을 유발할 수 있습니다. –

+2

여기 있습니다! PHP "참조로 반환"(또는 매개 변수를 참조로 전달, 같은 일) 반환 값을 지정하는 시점에서 앰퍼샌드를 제외하여 "참조로"무시할 수 있습니다. 미친 듯이 떠들썩한 버그에 대해 말하면 어딘가에서 빠져 나온 모든 것을 발견 할 수 있습니다. C#에서 "out"을 요구하는 것은 그러한 버그를 피하는 가장 안전한 방법입니다. –

+0

호기심으로 왜 과부하가 걸리지 않는 것이 좋습니다? 성능에 영향을 줍니까? 아니면 가독성을위한 것입니까? –

1

내가 볼 수있는 유일한 이유는이 매개 변수의 값이 함수에 의해 수정 될 수 있음을 알고있는 것입니다. 나는 그것이 좋은 것 같아요.

+0

수정할 수있을뿐만 아니라 수정할 수 있습니다. –

+0

Daniel :별로. 이 기능을 수정하지 않은 상태로 둘 수 있습니다. 'out'은 컴파일러에 의해 시행됩니다. 선언 함수가 다른 언어로 작성된 경우, 명확한 지정을 시행하지 않을 수도 있습니다. –

+0

다른 언어로 표시 되나요? 어느 것? –

2

이러한 결정의 출처를 알 수는 없지만 과부하 목적이 있음을 알고 있습니다.

이 같은 클래스에서 이러한 두 가지 기능을 만들 완전히 합법적이다 :

private void f(out OutputParameterClass outputParameter); 

및 오버로드를 호출 할 때 out 키워드를 지정

private void f(OutputParameterClass outputParameter); 

의미합니다.

1

나는 그것이 일관성과 명료성의 문제라고 생각한다.

분명히 컴파일러는 잘 수행 할 수 없습니다. 그러나 out 키워드를 추가하면 의도를 분명히하고 코드를보다 명확하고 읽기 쉽게 만듭니다.

2

가독성을 위해 메소드가 변수에 대해 수행 할 수있는 작업/수행 할 작업을 파악합니다.

는 MSDN에서 좀 더 정보를 가지고 : http://msdn.microsoft.com/en-us/vcsharp/aa336814.aspx

호출하기 전에 출력 매개 변수로 전달 된 변수에 할당 아웃 파라미터 필요가 없다 취하는 메소드의 호출; 그러나 수신자는 반환 전에 out 매개 변수에 을 할당해야합니다.