首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串实习生与referenceEquals

字符串实习生与referenceEquals
EN

Stack Overflow用户
提问于 2017-08-31 11:59:47
回答 1查看 94关注 0票数 1

我在试着理解弦乐实习。除了学习之外,没有其他任何真正的目的。

我现在在这里:

字符串是不可变的,并且是引用类型。正是这种不变性让我们可以做字符串实习。

如果没有字符串实习生,那么这两个字符串将是堆中的两个字符串。

例如:

代码语言:javascript
复制
private static void Main()
{
   var a = "foo";
   var b = "foo";
   ReferenceEquals(a, b); // would expect this to be false...
}

我希望ReferenceEquals是错误的。虽然这不是真的。我想要让它成为现实,我将不得不这样做:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-31 12:04:28

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

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45980973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档