-1

如果我有两个具有相同值的字符串,它们应该具有相同的引用,对吧?

这是我的情况:

string s1 = "aaa";
string s2 = "aaa";
Console.WriteLine(" s1: {0}; s2: {1}; equals: {2}", s1,s2, ReferenceEquals(s1, s2));

打印:s1:aaa;s2:aaa;等于:真

但看看这段代码:

string s1 = "aaa";
string s2 = new string(s1.ToCharArray());
Console.WriteLine(" s1: {0}; s2: {1}; equals: {2}", s1,s2, ReferenceEquals(s1, s2));

打印:s1:aaa;s2:aaa;等于:假

为什么在第二种情况下,ReferenceEquals 返回 false?

4

1 回答 1

-1

我找到了答案:实习池中只保存了文字字符串

驻留文字字符串在运行时很便宜并且可以节省内存。实习非文字字符串在运行时很昂贵,因此可以节省少量内存以换取使常见情况慢得多的情况。

interning-strings-at-runtime“优化”的成本并没有为收益买单,因此实际上不是优化。实习文字字符串的成本很便宜,因此确实为收益付出了代价。

于 2016-03-13T00:31:07.690 回答