天天看點

C#中new一個對象的過程說明

在代碼中我們經常能看到下面這樣的語句。

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 部分的代碼,運作程式得到下圖所示的結果。

C#中new一個對象的過程說明

在開發過程中,我們還是盡量不要讓一個引用指向null,否則在運作過程中很容易出現空引用的異常。

修改e2部分的代碼,去掉e2是否為空引用的條件判斷,并運作程式。

運作中,會産生“未将對象引用設定到對象的執行個體。”的異常。(原因你懂的。)

同樣去掉e1部分中是否為空引用的條件判斷語句,再次執行程式,一切正常。(因為e1指向了不為null的對象)