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

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


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

相关文章:

  • Linux系统管理与编程11: DHCP中继服务部署
  • OpenGL ES 2.0与OpenGL ES 3.1的区别
  • 深度剖析 Spring 源码 性能优化:核心原理与最佳实践
  • 啸叫抑制(AFS)从算法仿真到工程源码实现-第八节-系统搭建
  • React 组件之间的通信
  • Sublime全局搜索快捷键Ctrl+Shift+F不能使用解决
  • 计算机二级WPS Office第六套WPS演示
  • 字典树与01trie
  • 靶场(十八)---小白心得思路分享---shenzi
  • 26考研——栈、队列和数组_队列(3)
  • Elasticsearch7.X建模各属性文档
  • Ubuntu 24.04 LTS磁盘空间不足解决
  • Python爬虫:Feapder 的详细使用和案例
  • WRC世界机器人大会-2024年展商汇总
  • 解决PHP内存溢出问题的讨论和分析
  • LINUX基础IO [六] - 文件理解与操作
  • 第三天 开始Unity Shader的学习之旅之第二天的补充
  • 顺序表(C语言源码详解,附加测试代码)
  • el-table + el-pagination 前端实现分页操作
  • 16-CSS3新增选择器