看到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
}