2

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

4 回答 4

14

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

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

于 2011-03-01T04:48:02.057 回答
6

此图像可能有助于您理解该概念。

在此处输入图像描述

于 2011-03-01T04:49:29.950 回答
2

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

来自 MSDN

String 被称为不可变的,因为它的值一旦被创建就不能被修改。看起来修改字符串的方法实际上返回一个包含修改的新字符串。

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

于 2011-03-01T04:48:01.323 回答
1

当您分配"hi"给时string1,发生的事情是变量string1被分配了一个新的引用,该引用指向包含文本的堆上的一个对象"hi"

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

于 2011-03-01T04:56:38.573 回答