2011-12-05 22 views
1

어떻게 액세스 할 수 있습니까 null nullable의 propery HasValue?
컴파일 된 코드를 살펴 보았지만 통사론이 아닙니다. 그래서 당신이 NullReferenceException를 얻을하지 않습니다 - int?가 아닌, value 타입 참조 형식 인 Nullable<int>에 대한 짧기 때문에'.' 연산자 null null 가능

int? x = null; 
if (x.HasValue) 
{...} 

답변

11

의 :이 NullReferenceException이를 포기하지 않는 이유는

. 당신이 null를 할당 할 때

public struct Nullable<T> where T : struct 
{ 
    private readonly T value; 
    private readonly bool hasValue; 
    //.. 
} 

이 (Nullable<T>을 알고이 방법으로 특수를 취급) 단지를 설정하는 컴파일러에 의해 지원 일어나는 마법이 :

Nullable<T> 구조체는 다음과 같이 보입니다 hasValue이 인스턴스의 false 필드는 HasValue 속성에 의해 반환됩니다.

+0

추가, 구조체에는 null이 할당되지 않습니다. –

1

BrokenGlass과 마찬가지로, int?은 실제로는 Nullable<T>입니다.

구조체는 항상 값을 포함합니다. 일반적으로 구조체 변수를 null로 설정할 수는 없지만이 특별한 경우에는 기본적으로 default(Nullable<T>)으로 설정하면됩니다. 이것은 변수 자체보다는 내용을 null로 설정합니다.

Nullable<T>을 값으로 설정하면 암시 적 연산자를 사용하여 Value = value을 새 값으로 설정하고 HasValue = true을 설정합니다.

Nullable<T>을 null로 설정하면 구조체의 모든 필드가 null입니다. bool 필드의 경우 HasValue, null == false입니다.

변수가 구조이기 때문에 변수 자체가 아닌 내용이 null이므로 변수를 항상 참조 할 수 있습니다.

구조에 대한 자세한 내용은 MSDN 페이지 struct의주의 섹션을 참조하십시오.

+1

"구조 변수를 null로 설정하면 해당 내용이 변수 자체가 아닌 null로 설정됩니다." 이것은 잘못되었습니다 - 당신이'null'을 값 유형/struct에 할당 할 수 없습니다 - 컴파일러가'hasValue' 필드를 false로 설정하도록 적절히 변환하는'Nullable '을 제외하고는. 이것은 컴파일러가'Nullable '을 알고 있기 때문에 가능합니다. 따라서 "magic"주석이 있습니다. – BrokenGlass

+0

@BrokenGlass, 네 말이 맞아. 나는 VB.Net에 익숙하며 현재 C#을 가르치고있다. VB에서는'Dim x As SomeStructure = Nothing'을 지정할 수 있습니다. 나는 이것이'SomeStructure x = null'보다는'SomeStructure x = default (SomeStructure)'와 같다고 추측하고 있습니다. –

+0

@ Hand-E-Food, C# (+ VB)에 대한 답변을 업데이트하지 않으시겠습니까? – gdoron