为啥通过构造函数和 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 验证foonew string("foo".ToCharArray()) 将不是同一个实例(而它们将用于String.Intern(new string("foo").ToCharArray()))。 @Jeroen 更具体地说,它是从潜在字符串中查找 find 实习版本(如果有的话),因此代码可以更喜欢使用实习版本而不是分配(或将新创建的瞬态字符串放在地板上以供 GC 查找,改为使用实习版本)。 【参考方案1】:

文字字符串被保留。你的源代码中有文字foo

【讨论】:

我认为如何初始化字符串很重要,无论是作为文字还是通过构造函数。但我的错误是IsInterned 不会检查传递的字符串实例是否在实习表中作为参考而是作为值(如果我考虑一下就有意义)。

以上是关于为啥通过构造函数和 char[] 创建的字符串是实习生的?的主要内容,如果未能解决你的问题,请参考以下文章

c++(在类中)执行buf=new char[i];delete []buf; 为啥没有调用构造和析构函数?

为字符串类创建复制构造函数

为啥 sql 数据库不允许为所有查询创建函数而不是在调用程序中构造 sql 字符串?

java中String类的构造函数

String类

为啥我不能从 char* 构造 wstring