如果我有两个具有相同值的字符串,它们应该具有相同的引用,对吧?
这是我的情况:
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?
答案 0 :(得分:-1)
我找到了答案:只有文字字符串保存在实习池中
实习文字字符串在运行时很便宜并节省了内存。实时非文字字符串在运行时很昂贵,因此可以节省少量内存,以便使常见情况慢得多。
运行时实习字符串的成本"优化"不支付利益,因此实际上不是优化。实习文字字符串的成本很低,因此确实可以带来好处。