gpt4 book ai didi

c# - 字符串实习?

转载 作者:太空狗 更新时间:2023-10-29 18:04:19 25 4
gpt4 key购买 nike

第二个 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

当我执行 String.Intern(s4); 时,我仍然得到 false。

在这里,s3 和 s4 都被 intern 了,但是它们的引用不相等?

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)

最佳答案

s4 中的字符串被驻留。但是,当您执行 s4 += "m"; 时,您创建了一个新字符串,该字符串不会被驻留,因为它的值不是字符串文字,而是字符串连接操作的结果。因此,s3s4 是两个不同的字符串实例,位于两个不同的内存位置。

有关字符串实习的更多信息,请查看 here ,特别是在最后一个例子中。当您执行 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

关于c# - 字符串实习?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2706607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com