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

时间:2013-09-04 07:56:02

标签: c# reference

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是引用类型变量。

2 个答案:

答案 0 :(得分:3)

让我们用数字来做这件事:

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”。现在的区别是我们有一个对象,并且两个引用类型变量都指向同一个对象。我们更改了对象(不是引用)的值,因此无论您如何访问同一对象,更新都会更改它。

答案 1 :(得分:0)

让我们一块一块地看一下这段代码,看看它的作用:

a = "1411";

这会将对象的引用存储到变量a中。对象是string,并在堆上分配(因为它是引用类型)。

所以这里涉及两件事:

  • 变量a
  • 它引用的对象(字符串)

然后我们有了这个:

b = a;

这将使变量b引用a引用的同一对象。

内部引用被实现为内存地址,因此如果(示例)字符串对象位于地址1234567890,则两个变量的值都将是该地址。

现在,你这样做:

a = "5555";

这将更改a变量的内容,但b变量将保持不变。

这意味着b仍然引用旧对象,地址为1234567890,而a将引用不同的字符串对象。

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

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

但是,如果你给你的朋友一张带有不同地址的论文,即使这两个房子看起来相同,他们也不是同一个房子

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