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是引用类型变量。
答案 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
将引用不同的字符串对象。
您没有更改a
和b
所指的对象本身,您更改了a
。
正如马克在评论中所说,你可以把它比作在一张纸上给你一个房子的地址。如果你给你的朋友一张纸,在第二张纸上写同一个地址,你指的是同一个房子。
但是,如果你给你的朋友一张带有不同地址的论文,即使这两个房子看起来相同,他们也不是同一个房子。
因此引用类型与包含引用的变量之间存在很大差异。