out参数和ref参数类似,都是让形参成为实参的别名,具体的这里就不再详细描述,可以参考以下博客:C# 图解ref关键字按引用传递参数。下面上简单的代码来看下out参数的作用:
使用out前:
class Program
{
static void Method(int v)
{
v = 20; //对v赋值无法使得a1变成20
}
static void Main()
{
int a1 = 10;
Method(a1);
Console.Write(a1); //输出10
}
}
使用out后:
class Program
{
static void Method(out int v) //添加out的地方
{
v = 20; //对输出参数v赋值,这里就可以改变a1的值了
}
static void Main()
{
int a1 = 10; //声明out后,实参的初始值10不会传入方法,所以这里的赋值没有必要
Method(out a1); //添加out的地方
Console.Write(a1); //输出20
}
}
注意:由于实参的初始值不会传入方法,那么如果方法中有任何执行路径视图在方法给输出参数赋值之前读取它的值,编译器就会报错:
class Program
{
static void Method(out int v)
{
int temp = v; //报错!因为在方法内输出变量v并未被赋值,所以无法读取输出变量并赋值给temp
}
static void Main()
{
int a1 = 10; //声明out后,实参的初始值10并不会传入方法内
Method(out a1);
Console.Write(a1);
}
}
总结:ref和out有一个不同点,即ref要求在传递之前初始化变量,而out不用,这意味着声明out修饰符后,必须要在方法内用代码对out修饰的形参进行赋值。
当然out参数还有一个用途,即通过使用out参数,可以让方法返回多个值:
class Program
{
static void Method(out int v, out string s, out double d) //注意out的使用
{
v = 1;
s = "hello";
d = 3.1415926;
}
static void Main()
{
int a1;
string s1;
double d1;
Method(out a1, out s1, out d1); //注意out的使用
Console.WriteLine(a1);
Console.WriteLine(s1);
Console.WriteLine(d1);
}
}
输出结果:
1
hello
3.1415926