string a = "a";
string b = a;
Console.WriteLine(getMemory(a));
Console.WriteLine(getMemory(b));
a = "b";
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(getMemory(a));
Console.WriteLine(getMemory(b));
public static string getMemory(object o){
GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);
IntPtr addr = h.AddrOfPinnedObject();
return "0x"+ addr.ToString("X");
}
其中getmemory是获取内存中的分配的地址。转自https://www.jianshu.com/p/d38f64fde9eb。
上面代码输出依次结果为 0x2F222CC,0x2F222CC,b,a,0x2F222DC,0x2F222CC。可以看到,给a重新赋值之后,a的地址就改变了,而b指向的还是a最初的地址,所以a的值改变不会改变b的值。
但是引用类型中string才会有这种情况,代码如下
class test
{
public int value { get; set; }
}
test t1 = new test()
{
value = 10,
};
test t2 = t1;
t1.value = 20;
Console.WriteLine(t2.value);
输出的t2的value为20。所以引用类型中的string应该是特殊情况,记坑。