Jon*_*eet 17
您需要非常清楚引用类型与值类型之间的区别,以及"按值"参数与"按引用"参数之间的区别.
我有关于这两个主题的文章:
当使用作为引用类型的"by value"参数时,这两者相互作用:在这种情况下,按值复制的值是引用本身; 您仍然可以修改引用引用的对象:
void SomeMethod(StringBuilder x)
{
x.Append("Modified");
}
...
StringBuilder builder = new StringBuilder();
SomeMethod(builder);
Console.WriteLine(builder.ToString()); // Writes "Modified"
Run Code Online (Sandbox Code Playgroud)
请注意,这是不一样的东西传递by-reference语义......如果SomeMethod发生了变化,包括:
x = null;
Run Code Online (Sandbox Code Playgroud)
那么这不会使builder变量为null.但是,如果您也改变了x参数为ref StringBuilder x(并适当改变调用代码),那么任何改变x(如设置为null)将被调用者看到.
在设计自己的API时,我强烈建议您几乎不要使用ref或out参数.它们可以是有用的偶然,但通常它们是那些你想从一个单一的方法,这往往是更好地与一类专门封装的值,或者是一个做多返回值的指示Tuple,如果你正在使用的类型. NET 4.当然,这条规则有例外,但这是一个很好的起点.