ref和out是C#中的两个关键字,用于参数传递。
ref
ref关键字用于传递引用类型的参数。它可以将一个变量传递给方法,并使方法能够修改该变量的值。使用ref关键字时,方法中的参数必须先被初始化,否则编译器会报错。
注意:使用ref,首先需要使用”不是常量“的变量,其次是必须使用初始化过的变量。
C#不允许ref参数在调用他的函数中初始化
例如:
public void Method(ref int num)
{
num = num + 10;
}
int number = 5;
Method(ref number);
Console.WriteLine(number); // 输出 15
using System;
namespace ConsoleApp1
{
class Program
{
static void MaxValue(int[] intArray,ref int maxIndex)
{
int maxVal = intArray[0];
maxIndex = 0;
for(int i = 1; i < intArray.Length; i++)
{
if (intArray[i] > maxVal)
{
maxVal = intArray[i];
maxIndex = i;
}
}
}
static void Main(string[] args)
{
int maxIndex = 1;
int[] intArray = { 1, 7, 2, 4, 9 };
MaxValue(intArray, ref maxIndex);
Console.WriteLine($"maxIndex={maxIndex}");
}
}
}
out
out关键字也用于传递参数,但与ref不同的是,它可以用于传递值类型的参数。out关键字表示该参数是“输出参数”,即方法中必须给该参数赋值,否则编译器会报错。与ref不同的是,out关键字不要求参数在传递前被初始化。
它也类似于 in 关键字,只不过 in 不允许通过调用方法来修改参数值。 若要使用 out 参数,方法定义和调用方法均必须显式使用 out 关键字。
使用out
关键字指定参数为输出参数,在函数执行完毕后,该参数的值将返回给函数调用中使用的变量,out参数额外返回参数
注意:out参数可以使用未赋值的变量,使用时也将它看作未赋值,可以把已经赋值的变量用作out参数,但是存储的值会丢失
结束当前函数时必须对out参数赋值
例如:
public void Method(out int num)
{
num = 10;
}
int number;
Method(out number);
Console.WriteLine(number); // 输出 10
using System;
namespace ConsoleApp1
{
class Program
{
static void MaxValue(int[] intArray,out int maxIndex)
{
int maxVal = intArray[0];
maxIndex = 0;
for(int i = 1; i < intArray.Length; i++)
{
if (intArray[i] > maxVal)
{
maxVal = intArray[i];
maxIndex = i;
}
}
}
static void Main(string[] args)
{
int maxIndex;
int[] intArray = { 1, 7, 2, 4, 9 };
MaxValue(intArray, out maxIndex);
Console.WriteLine($"maxIndex={maxIndex}");
}
}
}
总的来说,ref和out都用于参数传递,但ref用于传递引用类型的参数,而out用于传递值类型的参数。在使用时,需要注意参数的初始化和赋值。