[英]C# Modifying Reference Type Objects doesn't reflect changes
我有這個C#代碼:
int i = 20;
object t = i;
object r = t;
r = 100;
為什么此時T的值仍然是20而不是100?
我以為T和R指向相同的位置,對它們中的任何一個的更改都應該相互影響...
我真的不明白引用類型如何在堆中工作,請幫助我
為什么此時T的值仍然是20而不是100?
因為您沒有修改t
。
您將要查找“ boxing” 。 但是,您的代碼中發生的事情是存儲在i
中的值20
被“裝箱”,這意味着分配了新的引用類型對象,並將值20
復制到了該對象中。
分配r = t
,會將該裝箱值的引用復制到t
。 到現在為止還挺好。
但是,當您指定r = 100;
,則您尚未修改框式值。 原始的裝箱值保持不變,但現在僅由t
引用。
賦值r = 100
會創建一個全新的裝箱值,分配給堆,並將該對象的引用復制到變量r
。 這對t
沒有影響, t
仍然設置為第一個裝箱值20
的參考。
當將整數值i
設置為對象t
,裝箱會發生,並且會將框內的整數值放入Heap中。
當將t
設置為r = t
時,它們將指向堆上的相同參考地址。 但是,當您使用新的整數值將r
設置為r
r = 100
時,會出現新的裝箱,並且r
指向另一個地址。
首先,裝箱和拆箱是非常昂貴的事情。 為什么要嘗試將整數設置為object?
如果要將整數傳遞給某些方法並獲得更改的值,則可以在method參數中使用ref
關鍵字。
在下面,您可以找到示例代碼:
public int GetValue() {
int i = 20;
SetNewValue(ref i);
return i;
}
public void SetNewValue(ref int value) {
value = 100;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.