引用:ref和out
- 引用
都是传递引用,相当于C++的&
ref和out的区别在于:
- 用ref传入方法的参数时,必须对该参数赋初值;
- 在方法进行调用时,也要加关键词ref,out
- 被out修饰的变量使用前可以不初始化,因为即使初始化方法中也无法取得该值,但在方法中必须初始化(即使不使用)
out 比起 ref 来说,还有一个用法就是可以作为多返回值来用,都知道函数只能有一个返回值,C#里,如果你想让一个函数有多个返回值,那么OUT能很容易解决。
例
static void Method(ref int i)
{
i = 44; //3.如果采用out关键词,此时i必须赋值;如果没赋值而直接使用参数i,则抛出错误信息“使用了未赋值的out参数”,外面的值传不过来。ref可以
}
static void Main()
{
int val = 0; //注意1.传参前,ref参数赋值
Method(ref val); //2.关键词ref
// val is now 44
}
- 重载
尽管 ref 和 out 在运行时的处理方式不同,但在编译时的处理方式相同。
因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。但是ref参数和普通参数,可以重载
{
// ref和out重载:报错
public void SampleMethod(out int i) { }
public void SampleMethod(ref int i) { }
}
{
//ref和普通重载:可以
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}
- 传递数组
static void AddNumberOne(int[] a) //传递的是数组的地址
static void AddNumberTwo(ref int[] a) //一样
有一点注意:
// int[] Array = new int[] { 1, 2, 3, 4 };
static void AddNumberOne(int[] a)
{
a[0] = 10;
//此时Array = {10, 2, 3, 4}
}
static void AddNumberTwo(ref int[] a)
{
a[0] = 20;
//此时Array = {20, 2, 3, 4}
}
static void AddNumberThree(int[] a)
{
a = new int[10];
a[0] = 30;
//此时Array = {20, 2, 3, 4}
}
static void AddNumberFour(ref int[] a)
{
a = new int[10];
a[0] = 40;
//此时Array = {40, 0, 0, 0, 0, 0, 0, 0, 0, 0}
}
这说明:
- 在传入数组名时,传递的是数组地址,直接改变原数组元素(ref和非ref一样)
- 第三个例子里,a = new之后,a的数值改变(如2312变成8790),但是由于传入的是拷贝,原Array地址还是2312,因此Array不变
- 第四个例子,a 和 Array是一个东西,a变成了8790,Array也是8790