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

标签 c# parameters

我对参数有点困惑。在 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 时,我强烈建议您几乎永远不要使用refout 参数。它们可以偶尔有用,但通常它们表明您正在尝试从单个方法返回多个值,这通常最好使用专门封装这些值的类型来完成,或者可能是Tuple 类型(如果您使用的是 .NET 4)。当然,这条规则也有异常(exception),但这是一个很好的起点。

关于c# - c#中值类型和引用类型的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3615498/

相关文章:

parameters - 带有请求参数的 RestTemplate GET 请求

sql - "Order By"使用参数作为列名

Scala:如何设置在抽象父类(super class)构造函数中定义的实例字段?

c# - 为什么是 ArgumentNullException?为什么不是 System.NullReferenceException?

C# 在构造函数中使用 ID 创建对象

c# - 每次使用相同的连接字符串创建多个 MongoClient 实例是否安全?

c# - 在文本框中,保护第一个单词,但允许添加/编辑这些单词之后的文本

javafx - 传递参数JavaFX FXML

c# - 基于类设计生成类 - 开源工具?

oracle - 如何避免 PL SQL 中未使用参数的警告?