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)
谢谢
y是不是在第一个例子空,正是因为参数是按值传递.计算参数表达式(简单y),并将其值(对a的引用作为初始值StringBuilder复制到参数variable(x)中.
改变的价值x并没有改变的价值y.
第二个示例不会更改参数(x)的值- 它会更改x引用的对象中的数据.y仍未更改的值:它仍然引用同一个StringBuilder对象,只是该对象现在包含不同的数据.
如果我给你一张带有我家庭住址的纸张,然后你去那个地址并把房子涂成红色,你就不会改变那张纸,你呢?如果你确实在我的地址上划掉了我的地址(如第一个例子中那样),这不会改变我对地址的看法 - 就像更改值x不会改变它的值一样y.