Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么要插入通过构造函数创建并带有char[]的字符串?_C#_.net_String_String Interning - Fatal编程技术网

C# 为什么要插入通过构造函数创建并带有char[]的字符串?

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按内容检查,而不是按实例检

我确信这将输出false,但它输出true:

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
不会检查传递的字符串实例是否作为引用而作为值(如果我考虑一下,这是有意义的)。