c#里ref和out关键字
在 C# 中,ref 和 out 关键字都用于方法参数传递时的引用传递,但它们有一些关键区别。
ref 关键字
作用
ref 关键字用于按引用传递参数,要求参数在传递给方法之前必须初始化。方法内部对参数的修改会影响到调用者的变量。
示例
1 | using System; |
注意:
ref参数的值必须在调用方法前赋值,否则编译会报错。
out 关键字
作用
out 关键字用于按引用传递参数,但参数在传递给方法之前可以不初始化,方法内部必须对参数进行赋值。
示例
1 | using System; |
注意:调用
out方法前,参数可以不初始化,但方法内部必须给out参数赋值,否则编译错误。
ref 和 out 的区别
| 关键点 | ref |
out |
|---|---|---|
| 传递方式 | 按引用传递 | 按引用传递 |
| 传递前是否需要初始化 | 需要 | 不需要 |
| 方法内部是否必须赋值 | 不强制 | 必须赋值 |
| 适用场景 | 需要传递已初始化的变量,并可能修改其值 | 适用于返回多个值的情况 |
ref 和 out 的应用场景
ref 适用场景
- 修改原始值(如修改方法外的变量值)
- 传递大对象,避免值传递带来的性能开销
out 适用场景
- 返回多个值(如
TryParse方法) - 不关心传入值,只关心返回值
ref 和 out 在方法重载中的区别
C# 允许 ref 和 out 作为方法重载的区分因素:
1 | class Program |
TryParse 方法的 out 典型应用
C# 中 int.TryParse() 就是 out 的一个典型应用:
1 | int result; |
这里 TryParse 不需要 result 预先赋值,它在方法内部会赋值。
7. ref readonly(C# 7.2 引入)
如果你想用 ref 但不希望方法内部修改传入的值,可以使用 ref readonly:
1 | static void PrintValue(ref readonly int x) |
这在高性能场景(如结构体传递)中可以减少值复制的开销。
总结
ref:必须初始化,方法内部可以修改参数值。out:不需要初始化,方法内部必须赋值。ref readonly:按引用传递但只读。out适用于返回多个值,ref适用于修改变量。