1 .net c# string stringbuilder reference-type
以下代码如何工作?
public void SomeMethod()
{
StringBuilder sb = new StringBuilder();
AppendFoo(sb);
String foo = sb.ToString(); // foo is "foo"
String s = String.Empty;
AppendBar(s);
String bar = s; // bar is empty
}
public void AppendFoo(StringBuilder x)
{
x.Append("Foo");
}
public void AppendBar(String x)
{
x = x + "Bar";
}
Run Code Online (Sandbox Code Playgroud)
如果同时StringBuilder和String被引用类型,为什么字符串对象未通过时,它通过改变AppendBar方法,而路过的时候就到StringBuilder对象被改变AppendFoo的方法,因为这两个参数的方法正在引用类型作为参数?
Jon*_*eet 13
忽略字符串暂时不可变的事实 - 它有点像红鲱鱼.重点是两者之间的区别:
x.Append(...);
Run Code Online (Sandbox Code Playgroud)
和
x = x + ...;
Run Code Online (Sandbox Code Playgroud)
仔细观察它们:第一个是作用于x所指的物体,改变物体的内容StringBuilder.第二个是更改值x以引用不同的对象(新字符串).它不会改变现有对象的内容.(事实上它不可能因为字符串是不可变的,但无论如何都会应用相同的逻辑.)
更改x方法中的值不会更改用于初始化的参数的值x.
关键点在于区分更改变量的值和更改其引用的对象的内容.一旦你有了这个差异,其余的应该到位.
阅读更多关于这一点,参数,我的参数传递的文章,以及更多的引用类型VS价值类型的另一篇文章.