C# 中 ref 和 out 的学习笔记

一句话搞懂区别

  • ref​:传进去的时候​必须有值,方法里可以改它,改完外面也能看到。
  • out​:传进去的时候​不用有值​(甚至不能有值),方法里​必须给它赋值,赋完值外面就能用。

为什么需要它们?

C# 默认是“值传递”——你传一个变量进去,方法里改的是副本,外面原变量纹丝不动。

但有时候我们就是想让方法​直接改外面的变量​,或者​一次返回多个结果​,这时候就得靠 ref​ 和 out


ref:传进去有值,还能改

举个栗子

static void Main()
{int number = 10;Console.WriteLine($"调用前: {number}"); // 输出:10DoubleIt(ref number); // 注意:这里要加 ref!Console.WriteLine($"调用后: {number}"); // 输出:20
}static void DoubleIt(ref int value)
{value = value * 2; // 直接改外面的 number
}

关键点:

  • 调用时:必须加 ref
  • 传入前:​变量必须初始化​(比如 int number = 10;
  • 方法里:可以读也可以写
  • 本质:相当于传了个“地址”,方法直接操作原变量

out:专门用来“输出”结果

举个栗子

static void Main()
{// 注意:这里没给 result 赋值!甚至不能赋(赋了也白赋)bool success = TryParseInt("123", out int result);if (success){Console.WriteLine($"解析成功: {result}"); // 输出:123}
}// 模拟 int.TryParse
static bool TryParseInt(string input, out int output)
{// out 参数在方法里必须赋值!否则编译报错if (int.TryParse(input, out output)){return true;}else{output = 0; // 必须赋值,哪怕没用return false;}
}

关键点:

  • 调用时:必须加 out
  • 传入前:​不需要初始化(写了也白写,编译器会忽略)
  • 方法里:​必须至少赋值一次(否则编译不过)
  • 用途:常用于“尝试操作”并返回额外结果(比如解析、查找等)

对比总结(表格更清楚)

特性 ref out
调用前是否要初始化 ✅必须 ❌不需要(甚至不能有值)
方法内是否必须赋值 ❌不强制(但通常会改) ✅必须至少赋一次
主要用途 修改已有变量 返回额外结果(多返回值)
调用时写法 Method(ref x) Method(out x)

实际应用场景

ref 常见用法:

  • 高性能场景(避免复制大结构体)
  • 需要修改传入的值(比如交换两个数)
void Swap(ref int a, ref int b)
{int temp = a;a = b;b = temp;
}

out 常见用法:

  • TryXXX​ 模式(如 int.TryParse​, Dictionary.TryGetValue
  • 一个方法返回多个结果
void GetCoordinates(out int x, out int y)
{x = 100;y = 200;
}

小贴士

  1. C# 7.0+ 支持在调用时直接声明 out 变量,不用提前定义:
if (int.TryParse("456", out var number))
{Console.WriteLine(number); // 直接用
}
  1. ref 和 out 不能重载​:Method(ref int)​ 和 Method(out int) 算同一个方法,会冲突。
  2. 别乱用​:大多数情况用返回值或元组(return (a, b);)更清晰。ref/out 适合特定场景。

最后一句话记住:

ref 是“带值进去,还能改出来”;out 是“空手进去,必须带值出来”。

搞定!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NXP - 在MCUXpresso IDE中编译调试Smoothieware固件工程 - 思路 - 教程

NXP - 在MCUXpresso IDE中编译调试Smoothieware固件工程 - 思路 - 教程2025-09-26 18:37 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: aut…

C# 序列化三种方式

序列化是啥? 就是把一个 C# 对象(比如 Person、Order)变成一串能存文件、能发网络的“字符串”或“字节”。 反序列化就是反过来,把这串东西变回对象。 为啥要干这事?存到文件(比如保存游戏进度) 发给别的程序(…

网站标题一样高端品牌运动鞋

目录 一.简介 二.常用接口 三.实战演练 1.径向渐变 2.QSS贴图 3.开关效果 4.非互斥 一.简介 QRadioButton控件提供了一个带有文本标签的单选按钮。 QRadioButton是一个可以切换选中(checked)或未选中(unchecked)状态的选项…

织梦网站添加视频教程莱芜新闻电视台节目表

目录 1、divmod函数: 1-1、Python: 1-2、VBA: 2、相关文章: 个人主页:非风V非雨-CSDN博客 divmod函数在Python中具有广泛的应用场景,特别是在需要同时处理除法的商和余数的情况下。常见的应用场景有&a…

VMware+RockyLinux+ikuai+docker+cri-docker+k8s 自用 实践笔记(一) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

区别:Modbus RTU 和 Modbus TCP

区别:Modbus RTU 和 Modbus TCP Modbus RTU 常用函数,如下://打印数组数据 static void printArray(const QString& title, qint64 dataLen, const uint8_t* data) {QString strPrint;for (int i = 0; i < d…

记录安装机器/深度学习环境(conda、CUDA、pytorch)时的一些问题

1. 正确查看自己的CUDA版本CUDA分为两种,驱动API和运行API。 驱动API指的是显卡驱动支持的最高cuda版本,我们运行程序时用的是运行API。nvidia-smi显示的是驱动所能支持的最大运行API版本。 nvcc --version查看的是C…

详细介绍:大数据毕业设计选题推荐:基于Hadoop+Spark的全球能源消耗数据分析与可视化系统

详细介绍:大数据毕业设计选题推荐:基于Hadoop+Spark的全球能源消耗数据分析与可视化系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importa…

5G车载市场新格局:国产崛起,从破局者到引领者的升维之战 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

python组合类型和组合可空类型

python组合类型和组合可空类型 漫思

深入解析:自动化接口框架搭建分享-pytest

深入解析:自动化接口框架搭建分享-pytestpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

手撕深度学习之CUDA并行规约算法(上篇):硬核揭秘200%性能提升的GPU优化之道,从硬件特性到算法实现的完整进阶指南

本文为CUDA并行规约系列文章的上篇,本系列将会介绍CUDA编程的一些基础软硬件知识,然后给出7种规约算法的实现,并从硬件的角度对它们进行分析和优化,最终给出一个开箱即用的模板代码。 本文主要介绍了CUDA编程的基础…

网络运营者中国seo第一人

1、ORACLE快速遍历树 2、join基表很大&#xff0c;性能问题 转载于:https://www.cnblogs.com/stevenlii/p/8631708.html

实战需求分析

需求获取的方法 1.制作调查问卷 2.单据分析(单据时客户填写的纸质单据) 3.报表分析(报表时客户对产品的反应的各种数据的整理) 如何分析报表:使用常识判断、听客户讲解、研习客户文档、研习电子表格公式

完整教程:实战:基于 BRPC+Etcd 打造轻量级 RPC 服务——高级特性与生产环境深度实践

完整教程:实战:基于 BRPC+Etcd 打造轻量级 RPC 服务——高级特性与生产环境深度实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …

哪里可以做网站优化网站怎么做配置文件夹

首先我们需要下载ssh&#xff0c;因为我们没有安装 sshd 命令意思是开启ssh 下载完以后要设置密码&#xff0c;我设置得是 123456 开启服务&#xff0c;查看ip 电脑连接 ssh 刚刚得ip -p 8022 后面就连接上了 我可以在这里启动我手机上的vnc

广州网站建设 seo怎么用ps做网站上的产品图

概述 实现规范化、标准化的引导式设计&#xff0c;以业务需求为输入&#xff0c;识别业务特点&#xff0c;并通过引导式设计&#xff0c;找到最适合的设计模式、具体方案&#xff0c;汇总成为应用的设计&#xff0c;拉齐各应用的设计一的致性。 采用标准化的方式开展设计…

数学草稿

P13645 Totient with Divisors \[\begin{aligned} \sum_{i=1}^n\sum_{j=1}^m\varphi(i)\varphi(j)\sigma(ij)&=\sum_{i=1}^n\sum_{j=1}^m\varphi(i)\varphi(j)\sum_{a|i}\sum_{b|j}\frac{ib}{a}\times[a\perp b]\\…

【RabbitMQ】主题(Topics)与主题交换机(Topic Exchange)

本章目标理解主题交换机(Topic Exchange)的强大路由能力。掌握通配符*和#的使用规则。学习基于模式匹配的复杂消息路由。实现一个支持多维度过滤的智能消息系统。一、理论部分 1. 主题交换机(Topic Exchange)简介 …

企业网站推广技巧有哪些怎样做免费网站推广

1.你说一下什么是分布式锁 分布式锁是一种在分布式系统环境下实现的锁机制&#xff0c;它主要用于解决&#xff0c;多个分布式节点之间对共享资源的互斥访问问题&#xff0c;确保在分布式系统中&#xff0c;即使存在有多个不同节点上的进程或线程&#xff0c;同一时刻也只有一…