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

StringBuilder and string.IsIntern method

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

含义:内部字符串与字符串字面值相同;来自生成器的字符串是不相关的。