当前位置: 首页 > article >正文

【C#】方法参数的修饰符ref 与 out

在 C# 中,refout 是方法参数的修饰符,用于将参数 按引用传递,而不是按值传递。这允许方法修改调用者传递的变量的值。尽管它们的行为类似,但有重要的区别和适用场景。


1. ref 的含义与使用

含义
  • 引用传递: 参数通过引用传递到方法中,方法可以读取和修改调用者的变量值。
  • 前置条件: 传递给 ref 参数的变量在调用方法之前必须已被初始化。
语法
void Method(ref int value)
{
    value += 10; // 修改引用传递的变量
}

int number = 5;
Method(ref number);
Console.WriteLine(number); // 输出: 15

2. out 的含义与使用

含义
  • 引用传递: 参数通过引用传递到方法中,方法可以修改调用者的变量值。
  • 前置条件: 传递给 out 参数的变量在方法调用之前 不需要初始化,但方法内部必须对其进行赋值。
语法
void Method(out int value)
{
    value = 10; // 必须在方法内赋值
}

int number; // 未初始化
Method(out number);
Console.WriteLine(number); // 输出: 10

3. refout 的区别

特性refout
传递方式按引用传递,方法可以读取和修改变量值。按引用传递,方法必须初始化变量。
参数初始化要求调用方法前,变量必须已被初始化。调用方法前,变量可以未初始化。
方法内赋值要求方法内可以选择是否赋值。方法内必须赋值,否则编译器报错。
常用场景用于在方法中读取和修改传入的值。用于从方法返回多个值,或方法输出结果。

4. 常见应用场景

ref 的应用场景
  1. 修改调用者变量的值

    • 用于需要在方法中更新传入变量值的场景。
    void DoubleValue(ref int value)
    {
        value *= 2; // 修改调用者变量
    }
    
    int number = 10;
    DoubleValue(ref number);
    Console.WriteLine(number); // 输出: 20
    
  2. 性能优化

    • 传递大型对象时避免值拷贝,直接传递引用以提高性能。
    void UpdateArray(ref int[] array)
    {
        array[0] = 42; // 修改数组第一个元素
    }
    
    int[] numbers = { 1, 2, 3 };
    UpdateArray(ref numbers);
    Console.WriteLine(numbers[0]); // 输出: 42
    
out 的应用场景
  1. 返回多个值

    • 通过 out 参数让方法返回多个结果。
    void Divide(int dividend, int divisor, out int quotient, out int remainder)
    {
        quotient = dividend / divisor;
        remainder = dividend % divisor;
    }
    
    int quotient, remainder;
    Divide(10, 3, out quotient, out remainder);
    Console.WriteLine($"商: {quotient}, 余数: {remainder}"); // 输出: 商: 3, 余数: 1
    
  2. 初始化未赋值的变量

    • 在方法内强制对变量进行赋值。
    bool TryParse(string input, out int result)
    {
        if (int.TryParse(input, out result))
            return true;
    
        result = 0;
        return false;
    }
    
    if (TryParse("123", out int value))
    {
        Console.WriteLine($"解析成功: {value}"); // 输出: 解析成功: 123
    }
    

5. refout 的注意事项

ref 注意事项
  1. 方法调用前,变量必须初始化:

    int x = 10;
    Method(ref x); // 合法
    int y;
    Method(ref y); // 编译错误:y 未初始化
    
  2. ref 参数可以读取和修改值:

    void ReadAndModify(ref int value)
    {
        Console.WriteLine($"当前值: {value}"); // 可以读取
        value += 10; // 可以修改
    }
    
out 注意事项
  1. 方法调用前,变量可以未初始化:

    int x; // 未初始化
    Method(out x); // 合法
    
  2. 方法内必须对 out 参数赋值:

    void Method(out int value)
    {
        // value += 10; // 编译错误:value 未赋值
        value = 10; // 必须显式赋值
    }
    

6. 总结

修饰符特点常用场景
ref按引用传递,必须在调用前初始化,方法可以读取和修改变量。更新调用者的变量值,或优化性能(避免值拷贝)。
out按引用传递,不需要在调用前初始化,方法内必须赋值。返回多个值,或强制初始化变量以返回结果。
选择使用:
  • 如果需要方法 修改变量值,并且需要变量在调用之前初始化,使用 ref
  • 如果方法只需要 返回额外结果,而调用者不需要预先初始化变量,使用 out


http://www.kler.cn/a/444925.html

相关文章:

  • 【学习总结|DAY021】Java 多线程
  • wireshark初认识
  • 二八(vue2-04)、scoped、data函数、父子通信、props校验、非父子通信(EventBus、provideinject)、v-model进阶
  • Linux文件:动静态库制作 动态库链接原理解析
  • 8K+Red+Raw+ProRes422分享5个影视级视频素材网站
  • 以腾讯混元模型为例,在管理平台上集成一个智能助手
  • 华纳云:虚拟服务器之间如何分布式运行?
  • PostgreSQL的交互式终端使用一系列命令来获取有关文本搜索配置对象的信息
  • WPF Binding 绑定
  • linux常用命令(touch、cat、less、head、tail)
  • Scala的惰性求值:深入理解与实践
  • 回归预测模型 | LSTM、CNN、Transformer、TCN、串行、并行模型集合
  • 最大子数组和 最大子数组和(有长度限制) 最大m段子数组和
  • windows openssl编译x64版libssl.lib,编译x64版本libcurl.lib,支持https,vs2015编译器
  • 【NVIDIA】启动ubuntu后显卡驱动丢失
  • esp8266_TFTST7735语音识别UI界面虚拟小助手
  • 信号处理相关的东东(学习解惑)
  • 高浓度盐酸除铁的详细介绍
  • mlr3超参数Hyperparameter 自动寻找auto
  • 9_HTML5 SVG (5) --[HTML5 API 学习之旅]
  • 详解ROS环境配置:setup.bash 文件的功能与操作
  • Oracle 中什么情况下 可以使用 EXISTS 替代 IN 提高查询效率
  • 8K+Red+Raw+ProRes422分享5个影视级视频素材网站
  • mysql同一张表中数据一样的问题和解决
  • 远程桌面连接
  • vue create 创建项目 提示 Failed to check for updates 淘宝 NPM 镜像站喊你切换新域名啦