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