2009-05-14 2 views
2

TryParse (string s, Out 객체 결과) 메소드를 구현하고 있습니다. 구문 분석에 실패하면 out 매개 변수를 건드리지 않으므로 이전 결과가 그대로 유지됩니다. 그러나 VS2k8은 나를 허용하지 않을 것입니다. 내가 상관없이 밖으로 개체의 가치를 설정해야합니다.TryXX() 메소드가 실패하면 out 값을 어떻게 설정해야합니까?

컴파일러를 기쁘게하기 위해 result = result를 넣어야합니까? 내가 놓친 게 있니?

답변

6

그것이 out 매개 변수이기 때문에 result = result 귀하의 제안이 작동하지 않습니다 - 확실히 시작하는 할당되지 않은, 그래서 당신은 당신이이에 값을 할당 한 때까지 그 값을 읽을 수 없습니다.

result = null; 

은 out 매개 변수로 object으로가는 것이 가장 좋습니다. 기본적으로 유형에 상관없이 default(T)을 사용하십시오. (default 연산자는 제네릭 메서드에서 유용합니다. 일반적으로 null, 0을 사용하는 일반이 아닌 코드의 경우)

EDIT : Boris의 의견을 바탕으로 다음과 같은 차이점을 자세히 설명해 두는 것이 좋습니다. ref 매개 변수와 out 매개 변수 :

아웃이 매개 변수

  • 확실히 호출자에 의해 할당 할 필요가 없습니다 수행
  • 메서드의 시작 부분에 "명확하게 할당되지 않은"것으로 처리됩니다 (로컬 변수와 마찬가지로 값을 먼저 할당하지 않고 값을 읽을 수 없습니다).
  • 메서드 앞에 확실히 할당되어야합니다. 메서드가 정상적으로 종료됩니다 (즉, 돌아 오기 전에; 이

참조) 매개 변수에 값을 할당하지 않고 예외를 던질 수있는 것은 매개 변수

  • 수행 확실히
  • 는 "확실히 할당"으로 처리됩니다 호출에 의해 할당되어야한다 메소드의 시작 부분에서 (값을 먼저 지정하지 않고 값을 읽을 수 있도록)
  • 메소드 내에서 지정하지 않아도됩니다 (예 : 매개 변수를 원래의 v alue)
+0

입니다. 처음에 out 파가 갖는 모든 값을 겹쳐 쓰려면 수락 된 프로 시저입니까? –

+1

그것은 받아 들여지는 것 이상의 것입니다 : 그것은 필수입니다. 메서드가 정상적으로 종료하기 전에 out 매개 변수 *를 반드시 지정해야합니다 (즉, throw가 아닌 ​​반환) –

+0

달리 수행 할 수 없습니다. 이것은 'out'이 의미하는 것입니다 - 클라이언트 값은 (over) 쓰여질 것입니다. 'ref'를 'out'하는 것의 이점은 클라이언트가 변수를 초기화하는 것을 신경 쓸 필요가 없다는 것입니다. 그는 선언 할 수 있습니다. 'out'위치로 전달 될 때 '초기'값이 설정됩니다. – Brian

2
result = null; 
+0

그런 다음 매개 변수를 자세히 터치합니다. 그것은 기본적으로 내 질문의 쇠고기입니다. –

7

null (또는 기본 (T)보다 일반적으로)을 할당하십시오. 값을 지정해야합니다. 즉, 'out'은 의미합니다.

+0

흠, 실제로 이것이 그렇게 될 것이라는 일반적인 이해 인 것 같습니다. 내 변수를 폴백 값으로 설정하고 tryparse를 수행하고 내 변수로 작업 할 수있는 옵션이 있으면 더 많은 정보를 얻으실 수 있습니다. 이제는 변수 중 하나라도 유효하게 구문 분석 된 값이나 폴백 값이 있습니다. –

+0

당신은 'ref'매개 변수를 사용하여 그 일을 할 수 있지만, (더 좋거나 나빴던) '표준 관용구'가되는 것에서 벗어나고 있습니다. – Brian

+0

@boris - 기본값 (T)의 폴백 값은 안전합니다. 일반적으로 호출 코드는 'false'가 주어지면 실제로이 값을 보지 않아야합니다. –

0

기본 값을 입력하십시오. 예를 들어, Int32.TryParse 메서드는 0을 넣습니다.

+0

기본값은 기본값 (T)이 정확함을 의미합니다. 맞습니까? – Kirtan

+0

올 Y 른 유형이 올 Y 르면 –

-3

결과를 설정해야하는 코드 앞에 예외가 발생할 수 있습니다.

+4

TryParse 메서드는 유효하지 않은 구문 분석의 경우 예외를 throw하지 않습니다. 이것은 아마 암시 적 계약을 위반 한 것으로 보일 것이다. –

0

발신자가 값을 초기화해야하지만 값을 지정하지 않으려면 ref 대신 out을 사용할 수 있습니다.