在下面的代码段中,我有两个变量firstString
和secondString
,它们具有相同的值“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如何处理这个?提前致谢
答案 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 ...”所在的位置。您应该知道,字符串变量保存了字符串实际所在的堆中的地址(引用)。