C# 中传参关键字 ref 和 out 笔记
哎呀,这个两个关键字就写篇 blog 是不是有点小题大做了呀,但是还是记录一下吧
突然想到的这两个速记和区分用法,说不定能帮到正在学习 C# 的你
快速说明
看着比较理论枯燥,可以直接跳到 举例说明
ref
和 out
都是 C# 中用于按引用传递参数的关键字,它们的主要区别在于对参数初始化的要求和使用场景。
相同点
两者都按引用传递参数,这意味着方法内部对参数的修改会直接影响到原始变量。
在方法声明和调用时都需要显式使用关键字。
不同点
- 初始化要求:
- 传递给
ref
的变量必须在传递之前初始化。 - 传递给
out
的变量不必在传递之前初始化,但必须在方法内部赋值。
- 传递给
- 使用场景:
- 需要在方法内部修改调用方传递的变量时。
- 主要用于方法返回多个值,或者需要在方法内部初始化参数时。
- 侧重点:
ref
侧重于修改传入的参数。out
侧重于输出参数,将方法内部的值传递给调用方。
更详细的解释
ref
ref 就像是给原始变量取了一个别名,方法内部通过这个别名操作的就是原始变量本身。
由于操作的是原始变量,因此必须保证变量在传递之前已经有值。
可以理解为“有进有出”,既可以传递值给方法,也可以从方法中获取修改后的值。
out
out 更像是方法用来“输出”数据的通道。
方法内部必须对 out 参数进行赋值,否则会导致编译错误。
即使在方法外部初始化了变量,在方法内部也会被覆盖。
可以理解为“只出不进”,方法只负责给参数赋值,并将值传递给调用方。
代码举例说明
1 | using System; |
其他记忆方法
1. 从英文单词的含义出发:
ref (reference 的缩写): 意味着“引用”。可以理解为“通过引用传递”,就像给变量取了一个别名,方法内部操作的就是原始变量本身。因此,原始变量必须先“存在”(即初始化)。
out (output 的缩写): 意味着“输出”。可以理解为方法用来“输出”数据的通道。方法负责给 out 参数赋值,并将值传递给调用方。因此,原始变量可以“不存在”(即不初始化),方法会负责“创造”它。
2. 类比生活中的场景:
ref: 想象你把家里的钥匙(原始变量)交给你的朋友(方法),让他帮你去家里拿东西。你的朋友必须先有钥匙才能进门(初始化)。他拿到东西后,你家里就有了那个东西(修改原始变量)。
out: 想象你委托快递员(方法)去商店买东西。你不需要事先给快递员任何东西(不初始化)。快递员到商店买好东西后,会把东西交给你(方法给 out 参数赋值)。
3. 关注初始化要求:
这是 ref 和 out 最关键的区别,也是最容易记住的点:
ref 需要“先有后用”: 传递 ref 参数前必须初始化。
out 可以“先用后有”: 传递 out 参数前可以不初始化,但方法内部必须赋值。
4. 从方法的功能角度考虑:
ref 侧重于“修改”: 方法需要修改调用方传入的变量。
out 侧重于“输出”: 方法需要返回多个值,或者需要在方法内部初始化参数。
5. 口诀记忆法:
可以尝试用一些简单的口诀来记忆:
ref: “引用传递先赋值,方法内外都变化。”
out: “输出参数不强求,方法内部必须赋。”