C#基础学习(五)函数中的ref和out

1. 引言:为什么需要refout

  • 问题背景:函数参数默认按值传递,值类型在函数内修改不影响外部变量;引用类型重新赋值时外部对象不变。
  • 核心作用:允许函数内部修改外部变量的值,实现“双向传参”。
  • 典型场景:需要函数返回多个值、高效操作大型值类型(如结构体)。

2. refout的基本使用

2.1 语法规则

​        ref关键字

void ModifyWithRef(ref int value) { 
    value = 10; // 可修改
}
调用前:变量必须初始化
int a = 5;
ModifyWithRef(ref a); // a变为10

        out关键字

void ModifyWithOut(out int value) { 
    value = 20; // 必须赋值
}

        调用前:变量无需初始化

int b;
ModifyWithOut(out b); // b被赋值为20

2.2 示例代码对比

static void Main(string[] args)
{
    // ref示例
    int x = 1;
    ChangeValueRef(ref x); // 需初始化
    Console.WriteLine($"ref结果: {x}"); // 输出3

    // out示例
    int y;
    ChangeValueOut(out y); // 无需初始化
    Console.WriteLine($"out结果: {y}"); // 输出3
}

3. refout的核心区别 

特性refout
初始化要求调用前必须初始化变量调用前无需初始化变量
赋值要求函数内部可不赋值函数内部必须赋值
设计语义“修改现有值”“输出新值”
编译器验证不强制检查赋值强制要求函数内赋值

4.引用示例:

 变量值交换

void Swap(ref int a, ref int b)
{
    int temp = a;
    a = b;
    b = temp;
}

// 调用
int m = 10, n = 20;
Swap(ref m, ref n); // m=20, n=10

 TryParse模式(常见API)

if (int.TryParse("123", out int result))
{
    Console.WriteLine($"解析成功: {result}");
}

总结:

  • ref:需要修改现有变量的值。

  • out:需要从函数中返回新生成的值,尤其是多返回值场景。

  • 替代方案:考虑使用元组(Tuple)或自定义结构体返回多个值。

在C#中,refout的底层行为与内存地址传递编译器规则密切相关。它们的本质是通过直接操作变量的内存地址来实现内外数据的同步修改,而非默认的值传递或引用副本传递。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值