2009-03-06 3 views
3

내 질문을하기 전에,이 예제의 기능을 살펴 보시기 바랍니다 :C#에서 "out"키워드를 지정해야하는 이유는 무엇입니까?

DateTime.TryParse("01/01/2000", out oDate) 

을하는 이유는 out 키워드를 지정해야합니까? 컴파일러가 함수 정의에서 이것을 알아야하지 않습니까?

필자는 순수 호기심에서 컴파일러에 대해 새로운 것을 배울 수 있기를 바랍니다.

나는 또한 C# .NET 3.5 컴파일러에 대해 특히 묻고있다.

답변

17

아웃 된 키워드 컴파일러에 의해 암시 할 수 있지만, 나의 이해는 C# 팀은 명시 적으로 매개 변수의 특성으로 가시성을 높이기 위해 함수의 호출에 의해 요구되는 out 키워드를하기로 결정한다는 것입니다.

+0

그들은 사용을 꺼려하기 위해 가능한 한 고통스럽게 만들고 싶었 기 때문에 아마도 그것을 사용하기로 결정했을 것입니다. –

+0

이것은 최고의 대답이었습니다. 감사합니다 :) – GateKiller

+2

"Anders Hejlsberg가" – BCS

10

컴파일러는 알고 있지만 그렇지 않을 수도 있습니다. 전달하는 매개 변수가이 함수에서 변경할 수 있다는 것을 알려주는 방법입니다.

2

그래 컴파일러는 그것을 알아낼 수 있지만,이 방법은 당신은 당신이 전달하는 변수를 수정하기 위해 진행되고 있다는 것을 알 수 있습니다.

C# 언어는 내가 명시 적으로 말할 안전망라고 부르는 많이 가지고 프로그래머가 무슨 일이 일어나고 있는지. 몇 가지 예는 다음과 같습니다.

  1. 전환 문이 없습니다.
  2. if 문에 값을 할당 할 수 없습니다. if (x = 5)가 true로 평가하는 대신 오류를 throw합니다.
+0

기술적으로 # 2가 잘못되었습니다. 기술적 인 정의는 if 문 안의 것은 부울 값으로 해석되어야한다는 것입니다. x = 5는 bool이 아닌 int를 반환하므로 컴파일러는 불평합니다. 그러나 다음은 유효합니다. bool foo = false, bar = false; if (foo = bar) {} – FryGuy

6

그것은 모든 개발자가 할 수있는이 호출을 실현하고 변수 X의 값을 변경합니다 확인하고 대한 컴파일러가 알고있는 것에 대해 것 아니다 C에서

이 많은이 그것의 한 뿌리 ++ 곳 기준치의 요구를 전화 사이트 모니터가 없습니다. C++ 호출을보고 정확히 무엇을 할 것인지를 아는 것은 불가능합니다. C++에서 참조와 값에 의해 전달 된 매개 변수는 의미에 큰 차이가 있습니다. 그 심판이 변수가 전달되기 전에 초기화해야합니다 제외

1

http://msdn.microsoft.com/en-us/library/t3c3bfhx(VS.80).aspx

는 "밖으로 키워드가 원인 인자가 참조에 의해 전달 될 수 있습니다. 이것은 심판의 키워드와 유사하다. out 매개 변수를 사용하려면, 모두가 메서드 정의와 호출 메서드는 명시 적으로 out 키워드를 사용해야합니다. "

DateTime.TryParse에는 oDate를 초기화 할 필요가 없으므로 out 키워드를 전달해야합니다.

0

저는 C# 전문가가 아니므로 엉망이라도 누군가 제발 저를 시정 해 주시겠습니까?

매개 변수를 값과 참조로 전달하는 두 가지 방법이 있습니다. 큰 차이점은 함수 내부에서 매개 변수를 수정하면 호출하는 데 사용 된 변수가 수정되는지 여부입니다. 이것은 내가 컴파일러가 스스로 결정할 것이라고 믿을만한 것이 아닙니다.

oDate를 호출자에게서 전달 된 변수로 변경하고 참조로 전달하려고합니다.

다른 질문은 초기화해야하는지 여부입니다. C#은 변수가 초기화되지 않은 상태에서 사용되는 경우를 잡아내는 것을 좋아하는데, 그 이유는 거의 항상 오류이기 때문입니다. 이 경우에는 전달하려는 것을 선언하고 TryParse()를 사용하여 첫 번째 값을 부여 할 수 있습니다. 이것은 완벽하게 합법적 인 기술이므로 컴파일러가 허용해야합니다. 이것은 컴파일러가 옳다고 믿지 않는 또 다른 것입니다. (나는 또한 컴파일러가 TryParse()에서 사용하기 전에 out 매개 변수가 초기화되었는지 확인합니다.)

따라서 "out"은 두 가지 용도로 사용됩니다. 매개 변수가 참조로 전달되고 함수 내부에서 초기화 될 것으로 예상됩니다. 이들 중 어느 것도 컴파일러에 의해 결정될 수 없습니다.

관련 문제