ref、out 参数
2026/6/6 22:22:01 网站建设 项目流程

## 一、共同特征
第一,ref与out都是地址传递,不再拷贝数据副本,方法内部修改参数,外部原始变量的值同步跟着变化。
第二,方法定义的形参、调用时的实参,两边必须同时写同一个关键字,要么全ref,要么全out,不能一个ref一个out混用。

## 二、ref参数知识点+示例代码
1. 语法规则:调用方法前,实参变量**必须提前初始化赋值**,未赋值变量不能作为ref实参传入。
2. 方法内部:ref参数既能读取原本传入的数值,也可以修改数值,只读取不修改代码也合法。
3. 适用场景:依托原有数据做修改,修改结果带回外层变量。

```csharp
using System;
class TestParam
{
//形参加ref
static void ChangeNum(ref int num)
{
num += 20;
}
static void Main()
{
int a = 10;//调用前必须赋值
ChangeNum(ref a);//实参同步写ref
Console.WriteLine(a);//输出30
Console.ReadKey();
}
}
```

## 三、out参数知识点+示例代码
1. 语法规则:调用方法前,实参可以不提前赋值,只声明变量即可。
2. 强制要求:在方法结束之前,代码必须给所有out形参完成赋值,缺少赋值直接编译报错,不能只读取不赋值。
3. 适用场景:一个方法需要返回多个运算结果,弥补return只能返回一个数据的短板。

```csharp
using System;
class TestParam
{
static void GetCalc(int x, int y, out int sum, out int sub)
{
sum = x + y;//out必须在方法内赋值
sub = x - y;
}
static void Main()
{
int s, d;//不用提前赋值
GetCalc(20, 5, out s, out d);
Console.WriteLine($"和:{s},差:{d}");
Console.ReadKey();
}
}
```

## 四、背诵口诀
ref带初始值进门,可读可改;out空手进门,方法内部必须赋值。

## 五、高频易错考点
1. out参数禁止只读取不赋值,编译报错;ref参数只读取不修改,语法正常。
2. ref和out修饰符不能交叉使用,形参ref、调用传out是错误写法。
3. 普通值传递复制新副本,方法修改副本不影响外面变量;ref/out共用同一块内存地址,内外数据联动变化。

## 补充:错误示例(加深理解)
### ref错误:变量未初始化
```csharp
int num;
ChangeNum(ref num);//报错,ref实参必须预先赋值
```
### out错误:方法内未给out变量赋值
```csharp
static void TestOut(out int n)
{
//没有给n赋值,编译报错
}
```

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询