字符串实习和 referenceEquals

string interning and referenceEquals

我正在尝试了解字符串实习。除了学习之外,不用于任何实际目的。

这是我所在的位置:

字符串是 immutable 和引用类型。正是这种不变性使我们能够进行字符串实习。

如果没有字符串驻留,这两个字符串将是堆上的两个字符串。

例如

private static void Main()
{
   var a = "foo";
   var b = "foo";
   ReferenceEquals(a, b); // would expect this to be false...
}

我认为 ReferenceEquals 是错误的。事实并非如此。我想让它成为现实,我必须这样做:

private static void Main()
{
   var a = "foo";
   var b = "foo";
   ReferenceEquals(a, b); // false??

   string.Intern(a);
   string.Intern(b);
   ReferenceEquals(a, b); // true?
}

据我所知,由于实习过程会在散列 table 中查找字符串,如果不存在,则会添加它。在进一步实习时,它会查找字符串,如果找到它,则会将引用更改为指向散列中的同一位置 table.

这应该加快比较速度?因为它不需要检查每个字符是否匹配并且可以只检查两个字符串是否指向相同的位置。 (让我们暂时忽略实际实习的开销,直到我理解这是如何工作的)。

所以我没有得到什么。为什么第一个代码块返回 true 而不是 false?

发生这种情况是因为 "foo" 被拘留了。

static void Main(string[] args)
{
    var a = "foo";
    var b = "foo";
    Console.WriteLine(string.IsInterned(a));

    Console.WriteLine(ReferenceEquals(a, b));
    Console.ReadLine();
}

编译器将保留所有文字/常量by default