原始值更改不会反映在引用类型变量中
本文关键字:引用 类型变量 原始 | 更新日期: 2023-09-27 18:30:04
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
。引用类型也是如此,但引用类型变量的"值">就是引用。不是对象。
如果将引用类型变量指定为不同的值(即指向不同的对象(,则只会影响该单个变量。
现在,如果您这样做了:
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
.
正如马克在评论中所说,你可以把这比作在一张纸上给你一个房子的地址。如果你给你的朋友一张纸,在第二张纸上写下相同的地址,你就指的是两张纸上的同一所房子。
但是,如果你给你的朋友一张写着不同地址的纸,即使两所房子看起来一样,它们也不是同一所房子。
因此,引用类型和包含引用的变量之间存在很大差异。