mol*_*a10 2 c# string stringbuilder
任何人都可以解释,为什么这段代码返回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));
Run Code Online (Sandbox Code Playgroud)
我用反射器看StringBuilder.ToString()方法但是找不到任何使用string.Intern的方法.
我使用的是Net Framework 4.5
在IsInterned返回非null价值,因为你都在问:
"是否存在与此序列匹配的实习值?如果是,请给我实习值"
是的,有一个interned值,因为字符串文字via ldstr是interned,并且字符串文字"abc"在该方法中使用(意思是:它将在该方法的JIT期间被实现).
在Equals返回true并不有趣:尝试ReferenceEquals,你会看到false.它们是不同的字符串实例; 这意味着:从制造商的价值是不一样实例作为实习文字.这证实了您的意思:StringBuilder不会自动检查实习池.
也许更有趣的是添加:
var str3 = string.IsInterned(str2);
Console.WriteLine(ReferenceEquals(str3, str1));
Console.WriteLine(ReferenceEquals(str3, str2));
Run Code Online (Sandbox Code Playgroud)
报道:
True
False
Run Code Online (Sandbox Code Playgroud)
含义:实习字符串与字符串文字相同; 构建器中的字符串是不相关的.
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |