看到String这一章时做了一下测试
String a = "me"; String b = a; Console.WriteLine(a);//me Console.WriteLine(b);//me a = "meeeee";//重新a赋值 Console.WriteLine(a);//meeeee Console.WriteLine(b);//me
书上说字符串不能被修改,之所以能重新赋值是原因是新建了字符串。
想了解下,上面哪句代码让字符串重新建的? 还有谁指向的谁?堆和栈是怎么存放的。
解决方案
10
msdn机翻太渣,还是请看原文https://msdn.microsoft.com/zh-tw/library/362314fe.aspx
10
你可以这样测试一下
using System; using System.Diagnostics; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { String a = "me"; String b = a; Console.WriteLine(a);//me Console.WriteLine(b);//me Debug.Assert(a.GetHashCode() == b.GetHashCode()); Console.WriteLine("hashcode_a={0},hashcode_b={1}", a.GetHashCode(), b.GetHashCode()); a = "meeeee";//重新a赋值 Console.WriteLine(a);//meeeee Console.WriteLine(b);//me Debug.Assert(a.GetHashCode() != b.GetHashCode()); Console.WriteLine("hashcode_a={0},hashcode_b={1}", a.GetHashCode(), b.GetHashCode()); Console.WriteLine("\r\n\r\n.................按任意键继续"); Console.ReadKey(); } } }
10
=号就会创建一个新的字符串对象
每次修改都会新建对象
另外,由于这个原因,假如拼接字符串的话,最好用stringbuilder类,否则效率低
每次修改都会新建对象
另外,由于这个原因,假如拼接字符串的话,最好用stringbuilder类,否则效率低
10
其实在”不能被修改上”,string也没有什么特殊的。
例如下例是本人写的引用类型,一样是不可修改:
class MyImmutable { public MyImmutable(int v) { this.Value = v; } public int Value { get; private set; } public MyImmutable Add(MyImmutable other) { return new MyImmutable(this.Value + other.Value); } public override string ToString() { return Value.ToString(); } } static void Main() { MyImmutable a = new MyImmutable(1234); MyImmutable b = a; Console.WriteLine(a);//1234 Console.WriteLine(b);//1234 a = new MyImmutable(5678);//重新a赋值 Console.WriteLine(a);//5678 Console.WriteLine(b);//1234 }