StringBuilder和string.IsIntern方法

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

Mar*_*ell 6

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)

含义:实习字符串与字符串文字相同; 构建器中的字符串是不相关的.