簡體   English   中英

為什么可空 <T> HasValue屬性不會在Null上拋出NullReferenceException嗎?

[英]Why does Nullable<T> HasValue property not throw NullReferenceException on Nulls?

考慮以下代碼:

DateTime? ndate = null;
Console.WriteLine(ndate.HasValue);

我本來希望有NullReferenceException,但是HasValue確實會返回false。 但是,由於ndate為null,因為沒有對象可以調用HasValue屬性,所以屬性調用如何成功?

從技術上講,“ ndate”不為null-它是一種值類型,其值指定為null。

當您編寫DateTime? ,這只是Nullable<DateTime>簡寫,它是一個結構。 從技術上講,這是不可能的,因為它不是引用類型。

Nullable<T>是一個結構,基本上它不能保存null值。

您的作業實際上被編譯成如下形式:

Nullable<DateTime> ndate = new Nullable<DateTime>();

另一個例子,表達式:

int? a = null;

將生成以下IL:

.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0)
IL_0000:  ldloca.s   V_0
IL_0002:  initobj    valuetype [mscorlib]System.Nullable`1<int32>

調用initobj操作,該操作將指定地址處的value類型的每個字段初始化為空引用或適當的原始類型的0。

總之,這里發生的是默認的struct初始化

我本來希望NullReferenceException

有被dereferenced沒有空引用 ,所以“的NullReferenceException”不應該期望。 可空的DateTime不是空引用 它是一個空值

但是,由於ndate為null,因為沒有對象可以調用HasValue屬性,所以屬性調用如何成功?

這個問題的前提是錯誤的前提。 有一個物體。 有一個可為空的DateTime,表示可為null的DateTime的空值。 該值是一個對象。

考慮您的代碼:

DateTime? ndate = null; 
Console.WriteLine(ndate.HasValue); 

這只是編寫邏輯上類似的簡短方法:

DateTime ndate = default(DateTime); 
bool ndateHasValue = false;
Console.WriteLine(ndateHasValue); 

可空值類型只是編寫代碼的一種令人愉快的方式,它意味着“請在此事物上附加一個布爾值,以跟蹤它在邏輯上是否為空”。

真正發生的是,實際的(非null) Nullable結構被分配給了變量,因此變量不是null,而是Value。

朋友,我是Synctactic糖...編譯器將.HasValue調用轉換為不會引發異常的代碼:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM