這個問題在這里已經有了答案: 為什么更新參考不更新物件? (2 個回答) 10 小時前關閉。
我創建了一個通用類,它包含一個簡單的物件(PassedObject),它只包含一個整數。為了了解我的容器在哪里丟失了對我的初始“PassedObject”實體的參考,我在簡單地更改了數字欄位后列印了資料,并在創建了 b 的新實體后再次列印了資料。
PassedObject b = new PassedObject(20);
ObjectHolder<PassedObject> objectHolder = new ObjectHolder<PassedObject>(b);
objectHolder.PrintData(); // prints 20
b.number = 888;
objectHolder.PrintData(); // prints 888
b = new PassedObject(7782);
objectHolder.PrintData(); // prints 888
b.number = 2;
objectHolder.PrintData(); // still 888, lost reference...
public class PassedObject
{
public int number { get; set; }
public PassedObject(int number)
{
this.number = number;
}
}
public class ObjectHolder<T> where T : PassedObject
{
public T passedObject;
public ObjectHolder(T newObject)
{
passedObject = newObject;
}
public void PrintData()
{
Console.WriteLine(passedObject.number);
}
}
我的問題是:鑒于我的 objectHolder 仍然指向同一個變數 (b),為什么我在重建它之后會丟失對 b 的參考?
uj5u.com熱心網友回復:
問題中的代碼有兩個PassedObject參考:一個在b變數中,一個在objectHolder.PassedObject變數中。
最初,代碼創建一個新PassedObject實體并將其分配給b參考。然后使用b參考來設定objectHolder.PassedObject.
此時,兩個參考都指向同一個物件,但它們仍然是兩個不同的變數。因為它們參考同一個物件,我們可以通過一個參考更新屬性,我們將看到另一個參考的變化。這就是為什么更改為888有效的原因。
但是,更新屬性與替換參考本身不同。代碼要做的下一件事是創建全新的PassedObject實體并將其分配給b參考。
至此,這兩個參考不再指向同一個物件。將objectHolder.PassedObject繼續參考仍設定為 的先前實體888。而且由于它是一個完全不同.number的參考,通過參考更新屬性b不會改變任何東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/497323.html
