为啥通过构造函数和 char[] 创建的字符串是实习生的?
Posted
技术标签:
【中文标题】为啥通过构造函数和 char[] 创建的字符串是实习生的?【英文标题】:Why a string is interned that is created via constructor and with a char[]?为什么通过构造函数和 char[] 创建的字符串是实习生的? 【发布时间】:2021-07-04 14:20:16 【问题描述】:我确信这会输出 false,但 actually 它输出的是 true:
string foo = new string("foo".ToCharArray());
Console.WriteLine(string.IsInterned(foo) != null); // true
我认为已经通过构造函数创建它会阻止字符串实习。但即使使用char[]
也会导致它被拘留。是什么原因或我的推理错误是什么?
【问题讨论】:
string.IsInterned
按内容而非实例检查。尝试string s = "foo"; Console.WriteLine(string.IsInterned(String.Concat("oof".Reverse())) != null);
,然后将分配注释到s
。您可以通过Object.ReferenceEquals
验证foo
和new string("foo".ToCharArray())
将不是同一个实例(而它们将用于String.Intern(new string("foo").ToCharArray())
)。
@Jeroen 更具体地说,它是从潜在字符串中查找 find 实习版本(如果有的话),因此代码可以更喜欢使用实习版本而不是分配(或将新创建的瞬态字符串放在地板上以供 GC 查找,改为使用实习版本)。
【参考方案1】:
文字字符串被保留。你的源代码中有文字foo
。
【讨论】:
我认为如何初始化字符串很重要,无论是作为文字还是通过构造函数。但我的错误是IsInterned
不会检查传递的字符串实例是否在实习表中作为参考而是作为值(如果我考虑一下就有意义)。以上是关于为啥通过构造函数和 char[] 创建的字符串是实习生的?的主要内容,如果未能解决你的问题,请参考以下文章
c++(在类中)执行buf=new char[i];delete []buf; 为啥没有调用构造和析构函数?