2011-12-05 15 views
1

どのようにアクセスできますnull nullableのpropery HasValue
私はコンパイルされたコードを見ましたが、それは構文的な砂糖ではありません。そう、あなたがNullReferenceExceptionを得ることはありません - int?が値型ではなく、参照型であるNullable<int>ための短いため'。'演算子null nullable

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

答えて

11

です:これはとNullReferenceExceptionをスローしませんなぜ

Nullable<T>構造体は、このようなものになります。あなたがnullを割り当てるときだけ設定します(約Nullable<T>を知っているし、このように特別扱います)コンパイラによってサポートで起こっていくつかの魔法がある

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

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になります。例えばHasValueのようなboolフィールドの場合、null == false

変数は構造体なので、変数自体ではなく内容がnullであるため、変数は常に参照できます。

構造に関する詳細は、MSDNページstructの「備考」セクションを参照してください。

+1

"構造変数をnullに設定すると、その内容は変数自体ではなくヌルに設定されます。これは間違っています。値型/ structに 'null 'を代入することはできません.' Nullable 'を除いて、コンパイラは 'hasValue'フィールドをfalseに設定するように適切に変換します。コンパイラは '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