ref
是传递参数的地址,
out
是返回值,两者有一定的相同之处,不过也有不同点。
使用
ref
前必须对变量赋值,
out
不用。
out
的函数会清空变量,即使变量已经赋值也不行,退出函数时所有
out
引用的变量都要赋值,
ref
引用的可以修改,也可以不修改。
1
、
与所有的
out
参数一样,在使用数组类型的
out
参数前必须先为其赋值,即必须由接受方为其赋值
2
、
2
、与所有的
ref
参数一样,数组类型的
ref
参数必须由调用方明确赋值。因此不需要由接受方明确赋值。可以将数组类型的
ref
参数更改为调用的结果。例如,可以为数组赋以
null
值,或将其初始化为另一个数组。
对于值类型的变量,如果没有
ref
,那么在函数中修改了变量的值是不会影响到原来变量的,但如果加了
ref
则会影响。
对于引用类型的变量,无论是否使用
ref
,对对象变量的属性进行修改同样会影响原来的变量。但如果对这个对象变量重新
new
一个(重新赋值),则不会影响原来的。而使用了
ref
则会影响的
。
所以,
ref
是否使用是针对变量级的,不是针对变量的属性的。
int i=0;
int[] iArr=new int[10];
iArr[0]=1;
void f1(int i)
{
i=2;
}
void f2(ref int i)
{
i=3;
}
void f3(ref int[] arr)
{
arr[0]=4;
}
void f4(int[] arr)
{
arr[0]=5;
}
void f5(ref int[] arr)
{
arr=new int[20];
}
void f6(int[] arr)
{
arr=new int[30];
}
调用以上函数:
f1(i);//
调用完后,
i
的值不变
f2(ref i);//
调用完后,
i
的值变为
3
f3(ref iArr);//
调用完后,
iArr
的元素数量不变,第一个元素的值变为
4
f4(iArr);//
调用完后,
iArr
的元素数量不边,第一个元素的值变为
5
f5(ref iArr);//
调用完后,
iArr
的元素数量变为
20
,原来的
iArr
变成孤岛而不可以控制了。
f6(iArr);//
调用完后,
iArr
的元素数量不变
using System;
class TestApp
{
static void outTest(out int x, out int y)
{//
离开这个函数前,必须对
x
和
y
赋值,否则会报错。
//y = x;
//
上面这行会报错,因为使用了
out
后,
x
和
y
都清空了,需要重新赋值,即使调用函数前赋过值也不行
x = 1;
y = 2;
}
static void refTest(ref int x, ref int y)
{
x = 1;
y = x;
}
public static void Main()
{
//out test
int a,b;
//out
使用前,变量可以不赋值
outTest(out a, out b);
Console.WriteLine("a={0};b={1}",a,b);
int c=11,d=22;
outTest(out c, out d);
Console.WriteLine("c={0};d={1}",c,d);
//ref test
int m,n;
//refTest(ref m, ref n);
//
上面这行会出错,
ref
使用前,变量必须赋值
int o=11,p=22;
refTest(ref o, ref p);
Console.WriteLine("o={0};p={1}",o,p);
}
}
下面的两个示例说明
out
和
ref
在将数组传递给方法上的用法差异。
示例
1
在此例中,在调用方( Main 方法)中声明数组 myArray ,并在 FillArray 方法中初始化此数组。然后将数组元素返回调用方并显示。
在此例中,在调用方( Main 方法)中声明数组 myArray ,并在 FillArray 方法中初始化此数组。然后将数组元素返回调用方并显示。
输出
数组元素是 :
1
2
3
4
5
示例 2
在此例中,在调用方( Main 方法)中初始化数组 myArray ,并通过使用 ref 参数将其传递给 FillArray 方法。在 FillArray 方法中更新某些数组元素。然后将数组元素返回调用方并显示。
输出
数组元素是 :
123
2
3
4
1024