StringBuilder and string.IsIntern method
本文关键字:method IsIntern string and StringBuilder | 更新日期: 2023-09-27 18:17:30
谁能解释一下,为什么这段代码返回abc, True?
var str1 = "abc";
var str2 = "";
var builder = new StringBuilder();
builder.Append("a");
builder.Append("b");
builder.Append("c");
str2 = builder.ToString();
Console.WriteLine(string.IsInterned(str2));
Console.WriteLine(str1.Equals(str2));
我看StringBuilder.ToString()方法与反射器,但不能找到任何使用字符串。实习
我用的是。Net Framework 4.5
IsInterned
返回非null
值,因为您正在询问:
"是否存在与该序列匹配的内部值?如果是,给我一个内部值"
是的,有一个被保留的值,因为通过ldstr
的字符串字面值被保留,并且字符串字面值"abc"
在该方法中使用(意思是:它将在该方法的JIT期间被保留)。
Equals
返回true并不有趣:试试ReferenceEquals
,你会看到false
。它们是不同的字符串实例;含义:来自构建器的值是而不是与内部文字相同的实例。这证实了你所说的:StringBuilder
不会自动检查实习池。
也许更有趣的是添加:
var str3 = string.IsInterned(str2);
Console.WriteLine(ReferenceEquals(str3, str1));
Console.WriteLine(ReferenceEquals(str3, str2));
的报告:
True
False
含义:内部字符串与字符串字面值相同;来自生成器的字符串是不相关的。