.NET字符串和引用类型参数

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)

如果同时StringBuilderString被引用类型,为什么字符串对象未通过时,它通过改变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价值类型的另一篇文章.