对C#不熟悉,我正在阅读一些指南。关于字符串here我读过(突出显示是我的):
字符串是不可变的 - 字符串对象的内容不能 在创建对象后更改,尽管语法可以实现 好像你可以这样做。例如,当您编写此代码时, 编译器实际上创建了一个新的字符串对象来保存新的 字符序列,变量b继续保持“h”。
string b = "h"; b += "ello";
但是尝试下面的代码,它会打印“你好”。
string b = "h";
b += "ello";
System.Diagnostics.Debug.WriteLine(b);
那么,我是否误解了我所阅读的内容,或者说文档错了?还有其他选择吗? :)
答案 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)分配了一个新字符串。