[英]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.