[英]Original Values changes are not reflecting in reference types variable
object a = "1411";
object b = a;
Console.WriteLine("Before Value of a " + a);
Console.WriteLine("Before Value of b " + b);
a = "5555";
Console.WriteLine("After Value of a " + a);
Console.WriteLine("After Value of b " + b);
Console.ReadKey();
輸出:
價值1411之前
b的前值1411
5555后值
b的后值1411
之后b的值也應該改為5555對嗎? 因為b是引用類型變量。
讓我們用數字來做到這一點:
int x = 1411; // now x is 1411
int y = x; // now y is 1411
x = 5555; // now x is 5555
Console.WriteLine(y);
現在: y
是什么? 很簡單:仍然是1411
。 給x
賦一個新值不會改變y
。 引用類型也是如此,只是引用類型變量的“值” 就是reference 。 不是對象。
如果將引用類型變量分配為其他值 (即指向其他對象),則只會影響該單個變量。
現在,如果您這樣做:
var x = new SomeClass { Foo = "1411" };
var y = x;
x.Foo = "5555";
Console.WriteLine(y.Foo);
那么這將打印“5555”。 現在的區別是我們只有一個對象,並且兩個引用類型的變量都指向同一對象。 我們更改了對象 (而不是引用)的值,因此無論您如何訪問同一對象,對其進行更新都會對其進行更改。
讓我們逐步看一下這段代碼,看看它的作用:
a = "1411";
這會將對對象的引用存儲到變量a
。 該對象是一個string
,並且在堆上分配(因為它是引用類型)。
因此,這里涉及兩個部分:
a
然后我們有這個:
b = a;
這將使得變量b
引用相同的對象的是a
指。
內部引用是作為內存地址實現的,因此,如果(例如)字符串對象位於地址1234567890,則兩個變量的值都將是該地址。
現在,您可以執行以下操作:
a = "5555";
這將更改a
變量的內容,但b
變量將保持不變。
這意味着b
仍然引用舊對象,地址為1234567890,而a
將引用其他字符串對象。
您沒有更改a
和b
都引用的對象本身,而是更改a
。
正如Marc在評論中所說,您可以將其比作在紙上給房子的地址。 如果您給朋友一張紙,在第二張紙上寫相同的地址,那么您指的是兩個人的同一個房子。
但是,如果您給您的朋友寫有不同地址的紙張,即使兩所房子看起來相同,它們也不是同一所房子 。
因此, 引用類型和包含引用的變量之間存在很大差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.