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

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

相关文章:

  • VSCode 市场发现恶意扩展正在传播勒索软件!
  • kettle插件-rabbitmq插件
  • 23种设计模式-访问者(Visitor)设计模式
  • 无参数读文件和RCE
  • PySide6属性选择器设置样式避坑
  • 力扣32.最长有效括号(栈)
  • 数据库理论基础
  • python3 的字符串
  • Linux touch命令
  • STM32学习笔记之振荡器(原理篇)
  • 大模型学习笔记(Langchain实践笔记)
  • PAT乙级(1077 互评成绩计算)C语言
  • 分布式锁,redisson,redis
  • 为什么要base64编码
  • 【极速版 -- 大模型入门到进阶】大模型如何学会使用对应的工具 (第二弹)
  • PyTorch量化技术教程:第四章 PyTorch在量化交易中的应用
  • 【漏洞复现】Apache Tomcat partial PUT文件上传反序列化漏洞复现(CVE-2025-24813)
  • 【JavaScript 简明入门教程】为了Screeps服务的纯JS入门教程
  • 第12章:优化并发_《C++性能优化指南》notes
  • P1722 矩阵Ⅱ - 洛谷
  • 科普|肩周炎的自限性,意味着不治也能自己好?
  • 上海畅通“外转内”,外贸优品成“香饽饽”
  • 新加坡国会选举投票抽样结果公布,执政党已获超半数议席
  • 英国传统两党受挫地方选举后反思,改革党异军突起“突破想象”
  • 包揽金银!王宗源、郑九源夺得跳水世界杯总决赛男子3米板冠亚军
  • 人民日报头版头条:青春为中国式现代化挺膺担当