也許你感覺到制造一個空值(null)是一個不值一提的話題
看看以下代碼
1

public class Check//支票
2
{
3
public string Signing;
4
public double Money;
5
}
Check的執行個體在沒有給Signing和Money指派前,Signing和Money是什麼值呢?
輸出勝于雄辯

Check check = new Check();

System.Console.WriteLine(check.Signing);//一個空行

System.Console.WriteLine(check.Money);//0
我們得到Money有了預設的double值:0
但Signing是不是空呢?


System.Console.WriteLine(check.Signing==string.Empty);//False

System.Console.WriteLine(check.Signing==null);//True
結果證明了Signing是null,而不是空的字元串。看來不給Signing指派和直接指派為null的結果是一樣的。
但是,Money為什麼是0,而不是null呢?是不是隻要給Money指派為null,就可以得到我們要的空的double呢?


check.Money = null;//無法将 NULL 轉換成“double”,因為它是一種值類型
失敗的原因呢?還是我們上一篇說的,引用類型允許在運作時才知道值的大小,而值類型必須在編譯時就知道值的大小和指派。
不過這樣的值類型特征在有些時候非常的不合适,假設我們要判斷使用者是不是給Signing指派過,我們可以簡單的編寫check.Signing == string.Empty || check.Signing == null,但對于Money就不能簡單地以System.Console.WriteLine(check.Money==0)來判斷,因為使用者可以顯式的指派為0。那怎麼辦呢?

public double? Money;
注意第4行的double?,該類型允許為Money指派為null
以下代碼運作通過


check.Money = null;//

System.Console.WriteLine(check.Money==null);//True
如果不給Money指派,他還是null嗎?
恩,是的,把這個class改為struct來證明

public struct Check//支票
沒有構造函數的struct會為每個字段賦預設值,輸出上面struct的Money,你得到的結果是null
本文轉自shyleoking 51CTO部落格,原文連結:http://blog.51cto.com/shyleoking/806253