Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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#字符串池引用_C#_String_Reference_String Pool - Fatal编程技术网

c#字符串池引用

c#字符串池引用,c#,string,reference,string-pool,C#,String,Reference,String Pool,如果我有两个值相同的字符串,它们应该有相同的引用,对吗 我的情况如下: string s1 = "aaa"; string s2 = "aaa"; Console.WriteLine(" s1: {0}; s2: {1}; equals: {2}", s1,s2, ReferenceEquals(s1, s2)); 版次:s1:aaa;s2:aaa;等于:真的 但看看这段代码: string s1 = "aaa"; string s2 = new string(s1.ToCharArray()

如果我有两个值相同的字符串,它们应该有相同的引用,对吗

我的情况如下:

string s1 = "aaa";
string s2 = "aaa";
Console.WriteLine(" s1: {0}; s2: {1}; equals: {2}", s1,s2, ReferenceEquals(s1, s2));
版次:s1:aaa;s2:aaa;等于:真的

但看看这段代码:

string s1 = "aaa";
string s2 = new string(s1.ToCharArray());
Console.WriteLine(" s1: {0}; s2: {1}; equals: {2}", s1,s2, ReferenceEquals(s1, s2));
版次:s1:aaa;s2:aaa;等于:错


为什么在第二种情况下,ReferenceEquals返回false?

我找到了一个答案:intern池中只保存文本字符串

在运行时,插入文字字符串的成本很低,并且可以节省内存。在运行时对非文本字符串进行内部存储是非常昂贵的,因此可以节省少量内存,以换取普通情况下的速度大大降低


在运行时对字符串进行“优化”的成本并不能带来好处,因此实际上并不是一种优化。实习文字字符串的成本很低,因此可以获得好处。

使用
string s2=string.Intern(新字符串(s1.tocharray())并重试@Valentin读到了关于
String interning
的文章,你是说我可以有很多值相同但引用不同的字符串变量?这与我对字符串池的了解相矛盾…应该是重复的。。。完全引用-
节省少量内存
在大多数情况下,它会增加程序的内存占用,而不是减少它。
在运行时对字符串进行“优化”的成本并不能带来好处
不正确。这通常是不值得的,但有时会是一场大胜利。因此,您可以显式地插入字符串,这样做有时非常有益,只是默认情况下没有这样做,因为这通常是没有好处的
插入文字字符串的成本很低
插入文字字符串的成本为零;它是在编译时完成的。