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

时间:2011-03-01 04:44:20

标签: c# .net string reference-type

如果.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*/

4 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:5)

此图片可能对您有所帮助,以便了解这一概念。

enter image description here

答案 2 :(得分:2)

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

来自MSDN

  

String被称为不可变因为   它的值一旦被修改就无法修改   已经被创造了。出现的方法   修改一个String实际上返回一个   新的String包含   修改

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

答案 3 :(得分:1)

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

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