我正在努力理解字符串实习。除了学习之外,不是为了任何真正的目的。
这是我在的地方:
字符串是不可变的和引用类型。它的这种不变性允许我们进行字符串实习。
没有字符串实习,这两个字符串将是堆上的两个字符串。
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?
答案 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。