我对参数有点困惑。在 c# 中使用方法/函数编程时,什么时候应该使用引用参数,什么时候应该使用值类型参数?
最佳答案
您需要非常清楚引用类型与值类型之间的区别,以及“按值”参数与“按引用”参数之间的区别。
我有关于这两个主题的文章:
当使用作为引用类型的“按值”参数时,两者会有些交互:在这种情况下,按值复制的值是引用本身;您仍然可以修改引用所指的对象:
void SomeMethod(StringBuilder x)
{
x.Append("Modified");
}
...
StringBuilder builder = new StringBuilder();
SomeMethod(builder);
Console.WriteLine(builder.ToString()); // Writes "Modified"
请注意,这不是与传递引用语义相同的东西...如果 SomeMethod
更改为包括:
x = null;
那么不会使 builder
变量为空。但是,如果您还将 x
参数更改为 ref StringBuilder x
(并适本地更改了调用代码),则对 的任何更改x
(例如将其设置为 null)将被调用者看到。
在设计您自己的 API 时,我强烈建议您几乎永远不要使用ref
或out
参数。它们可以偶尔有用,但通常它们表明您正在尝试从单个方法返回多个值,这通常最好使用专门封装这些值的类型来完成,或者可能是Tuple
类型(如果您使用的是 .NET 4)。当然,这条规则也有异常(exception),但这是一个很好的起点。
关于c# - c#中值类型和引用类型的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3615498/