string interning和referenceEquals

时间:2017-08-31 11:59:47

标签: c# string string-interning

我正在努力理解字符串实习。除了学习之外,不是为了任何真正的目的。

这是我在的地方:

字符串是不可变的和引用类型。它的这种不变性允许我们进行字符串实习。

没有字符串实习,这两个字符串将是堆上的两个字符串。

e.g。

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?
}

由于实践过程,据我所知,它在哈希表中查找字符串,如果没有,则添加它。在进一步实习时,它会查找字符串,如果找到它,则它会将引用更改为指向哈希表中的相同位置。

这会加速比较吗?因为它不需要检查每个字符是否匹配,只能检查两个字符串是否指向同一位置。 (让我们忽略实际实习的开销,直到我理解这是如何工作的。)

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

1 个答案:

答案 0 :(得分:1)

这是因为"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