C# 为什么要插入通过构造函数创建并带有char[]的字符串?
我确信这将输出false,但它输出true:C# 为什么要插入通过构造函数创建并带有char[]的字符串?,c#,.net,string,string-interning,C#,.net,String,String Interning,我确信这将输出false,但它输出true: string foo = new string("foo".ToCharArray()); Console.WriteLine(string.IsInterned(foo) != null); // true 我认为已经通过构造函数创建它会阻止字符串插入。但即使使用char[]也会导致它被拘留。原因是什么,或者我的推理错误是什么?插入了文字字符串。源代码中有文本foo。string.IsInterned按内容检查,而不是按实例检
string foo = new string("foo".ToCharArray());
Console.WriteLine(string.IsInterned(foo) != null); // true
我认为已经通过构造函数创建它会阻止字符串插入。但即使使用
char[]
也会导致它被拘留。原因是什么,或者我的推理错误是什么?插入了文字字符串。源代码中有文本foo
。string.IsInterned
按内容检查,而不是按实例检查。尝试string s=“foo”;Console.WriteLine(string.IsInterned(string.Concat(“oof.Reverse()))!=null)
然后将作业注释到s
。您可以使用Object.ReferenceEquals
验证foo
和new string(“foo.tocharray())
将不是同一个实例(而它们将用于string.Intern(new string(“foo”).tocharray())
。@Jeroen更具体地说,这是一种查找内部版本的方法(如果有)从一个潜在的字符串开始,这样代码可以更喜欢使用内部版本而不是分配(或者在地板上放置一个新创建的临时字符串,让GC查找,改用内部版本)。我认为如何初始化字符串很重要,如果是作为文本或通过构造函数。但我的错误是,IsInterned
不会检查传递的字符串实例是否作为引用而作为值(如果我考虑一下,这是有意义的)。