c#字符串是引用类型 – 为什么当我更改引用A的值时,引用B不会改变?

如果.NET中的字符串是引用类型,在下面的代码中,为什么string1更改后string2不会更改为“hi”?

static void IsStringReallyAReference() { string string1 = "hello"; string string2 = string1; Console.WriteLine("-- Strings --"); Console.WriteLine(string1); Console.WriteLine(string2); string1 = "hi"; Console.WriteLine(string1); Console.WriteLine(string2); Console.Read(); } /*Output: hello hello hi hello*/ 

这是因为C#字符串是不可变类型,这意味着您无法更改实例的值。

当您更改字符串的值时,您实际上是在创建一个新字符串,并将引用更改为指向新字符串,之后您的两个引用变量不再引用相同的字符串实例,一个引用原始字符串而另一个引用具有新值的新字符串实例。

此图像可能对您有所帮助,以便了解该概念。

在此处输入图像描述

这是因为Strings是.Net中的不可变类型,即每次修改字符串时都会创建一个新字符串。

来自MSDN

String被称为不可变的,因为它的值在创建后无法修改。 看似修改String的方法实际上返回一个包含修改的新String。

查看此链接的备注部分: http : //msdn.microsoft.com/en-us/library/system.string(v=VS.80).aspx

当您为string1分配"hi"时,发生的变化是为变量string1分配了对堆上包含文本"hi"的对象的新引用。

然而, 变量 string2 仍然保持对象的引用,其中包含文本 "hello"