簡體   English   中英

原始值更改未反映在引用類型變量中

[英]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將引用其他字符串對象。

您沒有更改ab都引用的對象本身,而是更改a

正如Marc在評論中所說,您可以將其比作在紙上給房子的地址。 如果您給朋友一張紙,在第二張紙上寫相同的地址,那么您指的是兩個人的同一個房子。

但是,如果您給您的朋友寫有不同地址的紙張,即使兩所房子看起來相同,它們也不是同一所房子

因此, 引用類型包含引用的變量之間存在很大差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM