在此之前,我們先看一段程序:
class Program
{
static void Main(string[] args)
{
Children children = new Children();
SetInstanceNull(children);
if (children == null)
{
Console.WriteLine("children is null");
}
else
{
Console.WriteLine(children.inter);
}
Console.Read();
}
static void SetInstanceNull(Children childrenParam)
{
childrenParam.inter = 10;
childrenParam = null;
}
}
class Children
{
public int inter = 0;
}
程序輸出結果:10
問題解析:
我 們知道方法參數如果是引用類型的話,則方法調用時,將把實例對象的地址傳遞給方法參數,這樣在被調用方法中就可以通過實例對象的地址來操作實例對象的數 據。故在SetInstanceNull方法中我們能將children實例中inter成員的值改更為10。然而childrenParam = null語句卻沒有使children為null,而僅僅是把childrenParam值為null。有人說children和 chilrenParam是兩個不同的變量,所以才有這樣的結果。的確,這種原因的產生是因為他們是兩個不同的變量導致的,但為什么不同呢?如果我們用 object.ReferenceEquals方法去驗證兩個變量的相等性的話,我們會發現結果是相等的。那這個相等一定表示這兩個變量相同嗎?答案是否 定的。在C#里面,當初始化一個類的時候,系統將使所有的引用引用類型參數引用為空,當遇到實例化一個類的時候,例如:new Children(),系統會在堆上分配一個內存空間存放Children實例,並將該地址返回給引用參數children。這種其實就是指針了。這樣引 用參數children與剛才實例化的Children實例就建立了一一映射關系。當調用方法SetInstanceNull時,系統將children 參數的引用復制給childrenParam參數。這樣在SetInstanceNull方法里面就可以操作剛才實例化的Children實例。所以 Children實例中的inter成員能夠被更改。childrenParam = null中語句只影響到childrenParam而沒有影響到children給了我們一點提示,那就是將引用類型參數賦值為null其實是切斷參數與 實例之間的聯系,當沒有任何參數與該實例有聯系的時候,該實例就會被垃圾回收器給回收。