微软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);
那么,是我误解了我所读到的,还是文档有问题?还有其他选择吗?:)
显然文档是错误的,正如您已经发现的那样,后一个版本已被更正,尽管它也有一些问题(见下文)。但我认为一个更好的例子是
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)。