Microsoft C#字符串文档:我是否误解了我所阅读的内容,或文档是否错误?

时间:2015-09-04 13:14:36

标签: c# string visual-studio-2013

对C#不熟悉,我正在阅读一些指南。关于字符串here我读过(突出显示是我的):

  

字符串是不可变的 - 字符串对象的内容不能   在创建对象后更改,尽管语法可以实现   好像你可以这样做。例如,当您编写此代码时,   编译器实际上创建了一个新的字符串对象来保存新的   字符序列,变量b继续保持“h”

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

但是尝试下面的代码,它会打印“你好”。

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

那么,我是否误解了我所阅读的内容,或者说文档错了?还有其他选择吗? :)

3 个答案:

答案 0 :(得分:7)

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

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

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

此外,应注意此代码中有3 string。首先是string字面值" h",然后是string字面值" ello"最后是string"你好"这是从前两个的连接中创建的。因为所有string文字都是实习的,并且实习字符串不是垃圾收集的,所以3个中最终有资格进行垃圾收集的d就是"你好"目前由string引用。虽然可以关闭def mailbox_section(title, current_box, opts = {}) content_tag :li, opts do link_to(conversations_path(box: title.downcase), html_opts = {}) do "#{title.capitalize} #{content_tag :span, :class => 'badge' do '2' end}".html_safe end end end 实习,但在这种情况下,所有三个最终都有资格进行垃圾收集。

答案 1 :(得分:2)

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

请注意,文档已经修改 Visual Studio 2008

  

字符串是不可变的 - 字符串对象的内容不能   在创建对象后更改,尽管语法可以实现   好像你可以这样做。例如,当您编写此代码时,   编译器实际上创建了一个新的字符串对象来保存新的   字符序列,并将新对象分配给b。该   字符串" h"然后有资格进行垃圾收集。

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

答案 2 :(得分:-1)

看起来文档错误:d += "ello";d = d + "ello";

的快捷方式

字符串对象本身是不可变的,但是您为现有变量(d)分配了一个新字符串。