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

4

2 回答 2

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”。现在不同的是我们有一个对象,两个引用类型的变量都指向同一个对象。我们已经改变了对象的一个​​值(不是引用),所以无论你如何得到同一个对象,更新它都会改变它。

于 2013-09-04T08:02:35.503 回答
1

让我们一块一块地看这段代码,看看它做了什么:

a = "1411";

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

所以这里涉及到两个部分:

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

然后我们有这个:

b = a;

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

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

现在,然后你这样做:

a = "5555";

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

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

你并没有改变对象本身,两者ab指的是,你改变了a

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

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

所以引用类型包含引用的变量之间有很大的区别。

于 2013-09-04T08:50:12.963 回答