原始值更改不会反映在引用类型变量中

本文关键字:引用 类型变量 原始 | 更新日期: 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将引用不同的字符串对象。

您没有更改ab所指的对象本身,而是更改了a.

正如马克在评论中所说,你可以把这比作在一张纸上给你一个房子的地址。如果你给你的朋友一张纸,在第二张纸上写下相同的地址,你就指的是两张纸上的同一所房子。

但是,如果你给你的朋友一张写着不同地址的纸,即使两所房子看起来一样,它们也不是同一所房子

因此,引用类型和包含引用的变量之间存在很大差异。