关于c#中参数传递的问题

odi*_*seh 1 c# parameter-passing

下面的例子来自Jon Skeet的文章" 参数传递C# ".

我的问题是:为什么变量y 在第一个例子中不为 null,而我们在第二个例子中看到它已被更改:

1-

void Foo (StringBuilder x)
{
    x = null;
}

...

StringBuilder y = new StringBuilder();
y.Append ("hello");
Foo (y);
Console.WriteLine (y==null);
Run Code Online (Sandbox Code Playgroud)

2-

void Foo (StringBuilder x)
{
    x.Append (" world");
}

...

StringBuilder y = new StringBuilder();
y.Append ("hello");
Foo (y);
Console.WriteLine (y);
Run Code Online (Sandbox Code Playgroud)

谢谢

Jon*_*eet 9

y不是在第一个例子空,正是因为参数是按值传递.计算参数表达式(简单y),并将其值(对a的引用作为初始值StringBuilder复制到参数variable(x)中.

改变的价值x没有改变的价值y.

第二个示例不会更改参数(x)的值- 它会更改x引用的对象中的数据.y仍未更改的值:它仍然引用同一个StringBuilder对象,只是该对象现在包含不同的数据.

如果我给你一张带有我家庭住址的纸张,然后你去那个地址并把房子涂成红色,你就不会改变那张纸,你呢?如果你确实在我的地址上划掉了我的地址(如第一个例子中那样),这不会改变对地址的看法 - 就像更改值x不会改变它的值一样y.