与c#中的值类型和引用类型混淆

Red*_*wan 2 c# parameters

我对参数有点困惑.当我们在使用c#中的方法/函数进行编程时,我们应该使用引用参数和什么时候必须使用值类型参数?

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时,我强烈建议您几乎不要使用refout参数.它们可以是有用的偶然,但通常它们是那些你想从一个单一的方法,这往往是更好地与一类专门封装的值,或者是一个做多返回值的指示Tuple,如果你正在使用的类型. NET 4.当然,这条规则有例外,但这是一个很好的起点.

  • +1从不使用ref或out参数. (2认同)