什麼是 null?
null是所謂的文字關鍵字
什麼是文字關鍵字
計算機是二進制表示一切,文字關鍵字就是以文字的形式表示某個特定的二進制值。比如ture,false也是文字關鍵字。可以認為true表示0x0001;false表示0x0000的bool值。
C#1.X中的null=空指針
MSDN中的解釋:null 關鍵字是表示不引用任何對象的空引用的文字值。null 是引用類型變量的默認值。
重點:區分引用類型和值類型。
string s="string";//引用類型。s是一個指針,該指針指向一個存放了"string"字符串的地址。
//*s指針[地址值(比如:0x00ff)]->[string]
int i=1;//值類型。i表示存放著數值一的實際區域。i[0x0001]
空指針的實際含義
string s;
string s=null;
//上面兩句是等效的。聲明了一個引用類型。
//假設聲明一個s相當於開辟了一個32位的內存區域,系統對該內存區域初始化全部為零。0x0000
當發現s中全部為0時,則認為該指針為空指針。即不引用(指向)任何對象。
為什麼C#1.x值類型不能為null呢?
int i;
//聲明一個32位的int型。系統對該內存區域初始化全部為零.0x0000
問題來了,當發現i中全部為零時,系統無法判斷該值是沒有賦值,還是為0值。
C#2.0中的可空類型Nullable<T>
在數據庫中,任何數據可以為空。但是在C#1.x卻不能,因此引入了Nullable<T>可空類型,T 必須是值類型
既然可空類型可以=null,那麼可空類型是值類型還是引用類型呢?
答:可空類型依然是值類型。但是對一個可空類型賦值為null和引用類型賦值為null的內部操作是不一樣的。
可空類型的內部結構中,有一個bool類型的變量。hasValue.當hasValue=false時,表示該對象為空。因此對於int?? i=null;所做的操作,其實是i.hasValue=false。而對string s=null所做的操作其實是*s=0;