1.用途:
在C#中当一个方法需要返回多个值的时候,就需要用到ref和out。
2.Ref使用
/// <summary>
/// ref正确例子
/// </summary>
/// <returns></returns>
public IActionResult Sample()
{
int x = 1;//初始化
int y = 1;//初始化
RefWay(ref x, ref y);
return Json(x, y);
}
/// <summary>
/// 方法
/// </summary>
/// <param name="x">参数X</param>
/// <param name="y">参数y</param>
public void RefWay(ref int x, ref int y)
{
x = 100;
y = 100;
}
输出:x=100,y=100
/// <summary>
/// ref错误例子
/// </summary>
/// <returns></returns>
public IActionResult Sample()
{
int x;//未初始化
int y;//未初始化
RefWay(ref x, ref y);
return Json(x, y);
}
/// <summary>
/// 方法
/// </summary>
/// <param name="x">参数X</param>
/// <param name="y">参数y</param>
public void RefWay(ref int x, ref int y)
{
x = 100;
y = 100;
}
错误信息:(1)使用了局部变量的“x”(2)使用了局部变量的“y”
注意:ref指定的参数在函数调用时候必须初始化,不能为空的引用。
2.Out使用
/// <summary>
/// out正确例子
/// </summary>
/// <returns></returns>
public IActionResult Sample()
{
int x;//未初始化
int y;//未初始化
RefWay(out x, out y);
return Json(x, y);
}
/// <summary>
/// 方法
/// </summary>
/// <param name="x">参数X</param>
/// <param name="y">参数y</param>
public void RefWay(out int x, out int y)
{
x = 100;
y = 100;
}
输出:x=100,y=100
/// <summary>
/// out错误例子
/// </summary>
/// <returns></returns>
public IActionResult Sample()
{
int x;//未初始化
int y = 100;//初始化
RefWay(out x, out y);
return Json(x, y);
}
/// <summary>
/// 方法
/// </summary>
/// <param name="x">参数X</param>
/// <param name="y">参数y</param>
public void RefWay(out int x, out int y)
{
x = y;
y = 100;
}
错误信息: 使用了局部变量的“y”
注意:out指定的参数在函数调用时候可以不初始化;参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。
总结:
1.口诀:ref有进有出,out只出不进。
2.out:举个例子--我们去商店(函数)买东西,我们可以带钱(参数初始化)也可以不带,不管我们带没带钱,我们今天的目的就是去拿东西,
然后欠钱(参数清空),因为和老板是好朋友。因此我们走的时候必须要带东西走(必须在函数内部赋初值)。
2.ref:举个例子--我们去商店(函数)买东西,我们必须要带钱(参数初始化),因为我们和老板不认识, 到商店之后,我们可以买东西也可以不买东西,假如我们买了东西,那么我们就可以带着物品(返回值)离开商店。假如我们没有买东西,那么我们就带着钱(返回值)离开商店。