我在试着理解弦乐实习。除了学习之外,没有其他任何真正的目的。
我现在在这里:
字符串是不可变的,并且是引用类型。正是这种不变性让我们可以做字符串实习。
如果没有字符串实习生,那么这两个字符串将是堆中的两个字符串。
例如:
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?
发布于 2017-08-31 12:04:28
发生这种情况是因为"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。
https://stackoverflow.com/questions/45980973
复制相似问题