对象引用行为

时间:2013-09-02 14:38:39

标签: c# c#-4.0

在下面的代码段中,我有两个变量firstStringsecondString,它们具有相同的值“Hello”。因此两个变量的引用位置是相同的。

var firstString = "Hello";
var secondString = "Hello";
bool isSameReference = Object.ReferenceEquals(firstString, secondString);
//same reference for both variables

但将secondString值更新为“嘿”不会更新firstString,即使它引用同一位置。为什么这些变量没有得到更新引用相同的参考位置?

secondString = "Hey..";
isSameReference = Object.ReferenceEquals(firstString, secondString); 
//reference changed but firstString not updated

secondString更新为其前一个值,因为“Hello”会使引用相同。

secondString = "Hello";
isSameReference = Object.ReferenceEquals(firstString, secondString); 
//now the reference for both variables are same

为什么c#有这种行为以及frmaework internaly如何处理这个?提前致谢

3 个答案:

答案 0 :(得分:5)

这个过程称为实习。您可以阅读有关there实习的字符串的更多信息。这样可以在分配具有与现有内容完全相同的内容的新sting时节省一些空间和处理时间。同样叮咬实习使得字符串比较琐碎操作。这是可能的,因为String是不可变类型。

答案 1 :(得分:1)

你没有更新字符串,你更新了对字符串的引用,现在指向“hey ...”,它不包括对firstString的字符串“Hello”的引用。此外,c#的“编译器”收集代码中的每个静态字符串都在没有doublets的列表中,这就是为什么在比较对它们的引用时,不同位置的两个不同“Hello”是相同的字符串的原因。

答案 2 :(得分:0)

C#(.NET)在.NET堆中只保留一次字符串文字。 “Hello”和“Hey ...”字符串存储在.NET堆上的两个不同位置。最初,firstString和secondString都指向“Hello”位置。 secondString =“嘿..”;只需将secondString变量更改为指向堆上“Hey ...”所在的位置。您应该知道,字符串变量保存了字符串实际所在的堆中的地址(引用)。