在代碼中我們經常能看到下面這樣的語句。
A a = new A();(1)
B b = null;(2)
C c;(3)
代碼(1)
建立A的對象并對其進行初始化。
A:類;
new A():建立A的對象并對其初始化;
a:引用,指向new A()這個對象的引用。
注意:a不是A的對象,new A()才是A的對象。
代碼(2)
聲明引用b,并指向null。
B:類;
b:引用,指向的對象為null(空)。
代碼(3)
與代碼(2)一樣,聲明一個引用。
與代碼(2)的差別是:代碼(3)中聲明的引用c不指向任何對象。
提示:變量本質上是引用的一個别名而已。
由上面的分析可以了解到,在C#中執行個體化一個對象時,需要經曆下面這幾步:
- 聲明引用;
- 使用new關鍵字建立類的對象并對其初始化;(配置設定記憶體空間)
- 将引用指向類的對象。
若沒有使用new關鍵字建立類的執行個體,則僅僅建立引用,指向的對象為null。
執行個體說明
public class ExampleModel
{
public int C1 { get; set; }
public string C2 { get; set; }
}
ExampleModel e1 = new ExampleModel();
ExampleModel e2 = null;
ExampleModel e3;
if (e1 == null)
{
Console.WriteLine("e1 == null");
}
else
{
Console.WriteLine("{ C1 = " + e1.C1 + ", C2 = " + e1.C2 + " }");
}
if (e2 == null)
{
Console.WriteLine("e2 == null");
}
else
{
Console.WriteLine("{ C1 = " + e2.C1 + ", C2 = " + e2.C2 + " }");
}
if (e3 == null)
{
Console.WriteLine("e3 == null");
}
else
{
Console.WriteLine("{ C1 = " + e3.C1 + ", C2 = " + e3.C2 + " }");
}
編譯代碼,會出現編譯錯誤,提示“使用了未指派的局部變量 e3 ”,原因是并未對 e3 進行初始化,但是使用 e2 變量時并不會産生編譯錯誤,因為 e2 已經被初始化了,隻是初始化的值為 null 而已,這并不影響編譯的通過。
注釋掉e3 部分的代碼,運作程式得到下圖所示的結果。
在開發過程中,我們還是盡量不要讓一個引用指向null,否則在運作過程中很容易出現空引用的異常。
修改e2部分的代碼,去掉e2是否為空引用的條件判斷,并運作程式。
運作中,會産生“未将對象引用設定到對象的執行個體。”的異常。(原因你懂的。)
同樣去掉e1部分中是否為空引用的條件判斷語句,再次執行程式,一切正常。(因為e1指向了不為null的對象)