2011-09-22 5 views
-1

가능한 중복 : 나는 "안전"nullable 형식에서 값을 얻기 위해 다음과 같은 형태를 모두 사용하는 코드베이스에서 일하고 있어요
Which is preferred: Nullable<>.HasValue or Nullable<> == null?Nullable에서 안전하고 올바르게 값을 가져 오겠습니까?

.

if (foo != null) { 
    value = (int)foo; 
} 

if (foo.HasValue) { 
    value = foo.Value; 
} 

내가 두 번째 양식을 선호하지만, 처음 만들 수있는 특정 상황 (또는 두 번째는 그 문제에 대해) 확실히 선호있다 : (? int)를 예를 들어, foo 경우 널 (NULL) 다른? 이 명 회원들과 구조체 -

답변

3

첫 번째와 두 번째는 정확히과 같으며 동일한 IL로 컴파일됩니다.

EDIT :

IL_000b: ldloca.s V_1 
    IL_000d: call  instance bool valuetype 
          [mscorlib]System.Nullable`1<int32>::get_HasValue() 
    IL_0012: ldc.i4.0 
    IL_0013: ceq 
    IL_0015: stloc.2 
    IL_0016: ldloc.2 
    IL_0017: brtrue.s IL_0023 
    IL_0019: nop 
    IL_001a: ldloca.s V_1 
    IL_001c: call  instance !0 valuetype 
          [mscorlib]System.Nullable`1<int32>::get_Value() 
    IL_0021: stloc.0 

이이 C# 4 규격 (또는 다른 버전에 상당)의 섹션 7.10.9에 의해 보장된다 : 그들은 실제로 이런 동일한 IL을 생성 않는다.

기본적으로 귀하와 귀하 팀 모두가 더 쉽게 읽을 수있는 형식을 사용하십시오.

안톤이 null-coalescing operator으로 강조 표시했습니다. Anton의 코드는 귀하의 코드와 동등하지 않지만 실제로는 좋은 코드를 만들 수 있으므로 확실히 익숙해야하는 연산자입니다.

+0

예, 컴파일러가 spec (버전 3.0 섹션 7.9.9, "Equality operators and null")을 준수하면 컴파일러에서 Value 속성을 사용한다는 것이 보장됩니다. – phoog

+0

@phoog : 잘 잡으세요. C# 4 사양에서는 7.10.9 절입니다. 편집 할 것입니다. –

1

나는 개인적으로

var value = foo ?? 0; 
+0

그것은 같지 않습니다. 'foo'가 null 인 경우에도'value' *의 값을 변경합니다. 이는 질문의 코드와 다릅니다. –

+0

아마, Jon,하지만 만약 당신이 그것을 사용하기 전에'value'가 초기화되지 않았다면 컴파일 에러를 낳을 것입니다. 그래서 안톤이 널 병합 연산자를 사용하여 제안한 것처럼 기본값을 초기화함으로써 코드를 더 읽기 쉽게 만들 수 있습니다. '?? '. – FMM

2

내가이 널 (NULL)이 실제로 무엇인지 나타 내기 때문에 두 번째 양식을 사용하는 경향이 선호합니다.

관련 문제