rkr*_*ter 8 c# string clr reference string-interning
第二个ReferenceEquals调用返回false.为什么s4中的字符串没有被中断?(我不关心StringBuilder优于字符串连接的优点.)
string s1 = "tom";
string s2 = "tom";
Console.Write(object.ReferenceEquals(s2, s1)); //true
string s3 = "tom";
string s4 = "to";
s4 += "m";
Console.Write(object.ReferenceEquals(s3, s4)); //false
Run Code Online (Sandbox Code Playgroud)
当我这样做时String.Intern(s4);,我仍然是假的.
在这里,s3和s4都被实习,但它们的引用不相等?
string s3 = "tom";
string s4 = "to";
s4 += "m";
String.Intern(s4);
Console.WriteLine(s3 == s4); //true
Console.WriteLine(object.ReferenceEquals(s3, s4)); //false
Console.WriteLine(string.IsInterned(s3) != null); //true (s3 is interned)
Console.WriteLine(string.IsInterned(s4) != null); //true (s4 is interned)
Run Code Online (Sandbox Code Playgroud)
Sco*_*man 17
字符串in s4实习.但是,在执行时s4 += "m";,您创建了一个不会被实习的新字符串,因为它的值不是字符串文字,而是字符串连接操作的结果.因此,s3它s4是两个不同内存位置中的两个不同的字符串实例.
有关字符串实习的更多信息,请查看此处,特别是在最后一个示例中.当你这样做时String.Intern(s4),你确实是在实际执行字符串,但是你仍然没有在这两个实体字符串之间执行引用相等性测试.该String.Intern方法返回实习字符串,因此您需要执行以下操作:
string s1 = "tom";
string s2 = "tom";
Console.Write(object.ReferenceEquals(s2, s1)); //true
string s3 = "tom";
string s4 = "to";
s4 += "m";
Console.Write(object.ReferenceEquals(s3, s4)); //false
string s5 = String.Intern(s4);
Console.Write(object.ReferenceEquals(s3, s5)); //true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1651 次 |
| 最近记录: |