4

据我所知,C# 中的字符串是引用类型。

所以在下面的代码中'a'应该等于“Hi”,但它仍然保持它的值“Hello”。为什么?

string a = "Hello";
string b = a;
b = "Hi";
4

5 回答 5

28

许多答案指出字符串是不可变的。虽然这是真的,但这与你的问题完全无关。

更相关的是,您误解了引用如何与变量相关。引用不是对变量的引用。将引用视为一段字符串。你从这个开始:

a----------------------Hello

然后你说“b = a”,这意味着将另一段字符串附加到附加到的同一事物a上:

a----------------------Hello
                      /
b---------------------

然后你说“现在将 b 附加到 Hi”

a----------------------Hello

b----------------------Hi

您认为引用的工作方式如下:

a----------------------Hello

然后我说这b是另一个名称a

a/b ----------------------Hello

然后我改变b了,它改变a了,因为它们是同一事物的两个名称:

a/b ----------------------Hi

或者你可能认为引用是这样工作的:

a----------------------Hello

然后我说是ba

b -------------- a ----------------------Hello

然后我改变b,间接改变a

b -------------- a ----------------------Hi

也就是说,您期望引用一个变量,而不是一个。您可以在 C# 中执行此操作,如下所示:

void M(ref int x)
{
    x = 1;
}
...
int y = 0;
M(ref y);

这意味着“在调用 M 期间,x 是 y 的另一个名称”。对 x 的更改会更改 y,因为它们是相同的变量。请注意,变量的类型不必是引用类型。

于 2012-04-04T05:49:27.523 回答
7

该行b = "Hi";更改了哪些字符串b引用。 a仍然参考"Hello"

string a = "Hello";  // Set a to reference the string "Hello"
string b = a;        // Set b to reference the same string as a
b = "Hi";            // Set b to reference the string "Hi"
于 2012-04-04T05:27:19.163 回答
1

您正在更改参考 b。不是一个。引用本身被复制,而对象保持不变。所以 b = "Hi" 将对 "Hi" 对象的引用复制到 b 中。这不影响a。

于 2012-04-04T05:28:41.643 回答
1

引用类型的概念是 OOP 程序员中最令人困惑的事情。

运行下面的代码,你会惊讶地看到答案:

创建一个Book具有调用属性的简单类,并在应用程序的方法中Name编写以下代码。Main

Book a = new Book() {Name = "book a"};
Book b = new Book() {Name = "book b"};

Book c = a; //line 3

Book a = b; //Line 4

Console.WriteLine(c.Name);

毫无疑问,由于第 4 行,您会期望答案是“book b”。您认为 as ca,然后a变成b ,这也将使c等于b

事实并非如此

在 Ballon 类比中阅读 Ballon anology 以获取 Reference type

于 2012-04-04T06:09:03.037 回答
0

不!

您所做的是创建两个对字符串“Hello”的引用('a','b')。随着b = "Hi"您更改“b”以引用字符串“Hi”。

'a' 永远不会改变这种方式。

于 2012-04-04T05:31:10.147 回答