一.ref关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何改变都将反
映在该变量中。若要使用ref参数,则方法定义和调用方法都必须显式使用ref关键字。也即是说,在方法中对参数的
设置和改变将会直接影响函数调用之处。无论函数的定义还是调用时均不可忽略关键字ref。
代码①: static void Main(string[] args)
{
int x = 10;
int y = 20;
M(ref x, ref y);
Console.WriteLine("x = {0} , y = {1}" , x , y);
Console.ReadLine();
}
static void M(ref int a , ref int b)
{
a = 521;
b = 520;
}
代码②: static void Main(string[] args)
{
int x = 10;
int y = 20;
M(ref x, ref y);
Console.WriteLine("x = {0} , y = {1}" , x , y);
Console.ReadLine();
}
static void M(ref int a , ref int b)
{
a = 1000;
b = 1;
}
在此可以看出,在方法中对参数所做的任何更改都将反映在该变量中,而在main函数中对参数的赋值却没有起到作用
,这是不是说明不需要进行初始化呢?看下面一个例子。
代码③: static void Main(string[] args)
{
int x ;
int y ;
M(ref x, ref y); //使用了未赋值的局部变量 x,y 。必须要初始化,否则编译通不过。
Console.WriteLine("x = {0} , y = {1}" , x , y);
Console.ReadLine();
}
static void M(ref int a , ref int b)
{
a = 521;
b = 520;
}
二.这说明,ref定义的参数在使用前必须初始化 , 无论在函数定义的时候参数有没有赋予初始值。这条正好区分
out指定的参数可以不在调用函数的时候进行初始化。
三.对out来说,第一条同样适用。将代码①以及②中的ref全部改成out,则可与使用ref得到同样的结果。
四.out指定的参数必须在函数定义的时候就赋初始值。否则出现错误。对比ref指定的参数则
可以不在函数内部赋初始值,在函数调用的时候在函数调用的时候哦在赋值也可以。
static void Main(string[] args)
{
int x = 10;
int y = 11;
M(ref x, ref y);
Console.WriteLine("x = {0} , y = {1}" , x , y);
Console.ReadLine();
}
static void M(ref int a , ref int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
代码④:static void Main(string[] args)
{
int x = 10;
int y = 11;
M(out x, out y);
Console.WriteLine("x = {0} , y = {1}" , x , y);
Console.ReadLine();
}
static void M(out int a , out int b)
{
int temp;
temp = a;//使用了未赋值的out参数,a在参数内部没有赋值,所以出错。
a = b;//使用了未赋值的out参数,b在参数内部没有赋值,所以出错。
b = temp;
}
总结以上四条得到ref和out使用时的区别是:
①.ref指定的参数(例子中的a,b)在函数调用时必须初始化不能为空的引用(x,y)。而指定的参数在函数调用时可以
不初始化(
static void M(ref int a , ref int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
)。
②.out指定的参数在进入函数时会清空自己,必须在函数内部赋初始值。而ref指定的参数不需要。
static void Main(string[] args)
{
int x ;
int y ;
M(out x, out y);
Console.WriteLine("x = {0} , y = {1}" , x , y);
Console.ReadLine();
}
static void M(out int a, out int b)
{
a = 1111;
b = 22222;
}
用ref时,例子中的x,y必须初始化值,a,b随便;用out时,M()方法中的参数a,b必须在M()方法内部初始化值,x,y随
便。