2016-05-12 3 views
-1

一般に、null値を持つオブジェクトのプロパティにアクセスすると、null例外が発生します。しかし、HasValueのプロパティNullableobjectにアクセスすると結果が得られます。私は何がsceenの後ろに実装されるのか知りたいです。(Nullable型).HasValueの背後の実装

+5

.NETソースは[利用可能なオンライン](http://referencesource.microsoft.com/#mscorlib/system/nullable.cs,ffebe438fd9cbf0e)です。 –

答えて

0

既に知られていない場合は、int?のようなヌル入力可能なタイプは、ちょうどNullable<int>です。

C#でのヌル可能な型は単なる「構文的な砂糖」です。コンパイル時に、コンパイラはint?double?bool?をすべてNullable<int>,Nullable<double>およびNullable<bool>に置き換えます。

Nullable<T>は、実際には構造体です。技術的には決してnullにはなりません!ヌル可能な型にnullを割り当てることができる理由は、もう一つの構文的な砂糖です。ヌル可能な型にnullを代入すると、HasValueプロパティがfalseに設定されます。 null以外の値を代入すると、HasValueが再びtrueに設定され、基になる値が設定している値に設定されます。

nullable型の仕組みについて簡単に説明します。今すぐ戻ってあなたの質問に:私たちはHashValueにアクセスするときに我々はのNullableオブジェクトのhasValueはプロパティにアクセスするとき

しかし、それは結果に

を与えるだろう、私はあなたが

を意味すると思います。しかしたとえ変数がnullであっても、int?のプロパティは例外をスローしません!どうして?

前に述べたように、Nullable<T>は構造体なので決してnullにはなりません。そのため、HasValueプロパティにアクセスして例外をスローすることはできません。

"なぜ、null可能なオブジェクトのValueプロパティにアクセスすると例外がスローされるのですか?"あなたは尋ねるかもしれない。

これは、Nullable<T>構造体の実装のためです。あなたがhereを見ることができるように:

public T Value { 
    get { 
     if (!hasValue) { 
      ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue); 
     } 
     return value; 
    } 
} 

それはもしhasValueが真であることを確認します。 falseの場合は例外をスローします。

だからだ。

関連する問題