微软c#字符串文档:是我误解了我所读的内容,还是文档有问题?

本文关键字:文档 有问题 字符串 误解 微软 | 更新日期: 2023-09-27 18:11:16

作为c#新手,我正在阅读一些指南。关于字符串,我读到(高亮显示是我的):

字符串是不可变的——字符串对象的内容不能不可变在对象创建后更改,尽管语法允许这样做表现出你能做到的样子。例如,当你写这段代码时,编译器实际上创建了一个新的字符串对象来保存new变量b继续保存"h"

string b = "h";
b += "ello";

但是尝试下面的代码,它打印"hello"

string b = "h";
b += "ello";
System.Diagnostics.Debug.WriteLine(b);

那么,是我误解了我所读到的,还是文档有问题?还有其他选择吗?:)

微软c#字符串文档:是我误解了我所读的内容,还是文档有问题?

显然文档是错误的,正如您已经发现的那样,后一个版本已被更正,尽管它也有一些问题(见下文)。但我认为一个更好的例子是

string b = "h";
string d = b;
d += "ello";

现在b仍然是"h",因为+=没有更新引用,但创建了一个新的string, d引用。

还应该注意的是,这段代码中有3个strings。首先是string字面值"h",然后是string字面值"ello",最后是string"hello",它是通过前两个字面值的连接创建的。因为所有string字面值都被保留,而被保留的字符串不会被垃圾收集,所以3个string中最终符合垃圾收集条件的只有d当前引用的"hello"。虽然可以关闭string实习,在这种情况下,所有三个最终都将有资格进行垃圾收集。

好吧,我看到的问题是,我正在看Visual Studio 2005文档,这是完全错误的。正确的更新文档在这里。

注意文档已经被修改了 for Visual Studio 2008:

字符串是不可变的——字符串对象的内容不能不可变在对象创建后更改,尽管语法允许这样做表现出你能做到的样子。例如,当你写这段代码时,编译器实际上创建了一个新的字符串对象来保存new字符序列,并将新对象赋值给b那么字符串"h"就符合垃圾收集的条件。

但是,正如juharr在下面的评论中正确指出的那样,它仍然是错误的,因为"h"是被拘禁的,并且从未被垃圾收集。

看起来文档是错误的:d += "ello";d = d + "ello";的快捷方式

字符串对象本身是不可变的,但是你将一个新的字符串赋值给一个现有的变量(d)。