-
in型参数
in型参数通过值传递的方式将数值传入方法中。即我们在Java中常见的方法 -
ref型参数
该种类型的参数传递变量地址给方法(引用传递),传递前变量必须初始化。
该类型与out型的区别在与:
1).ref型传递变量前,变量必须初始化,否则编译器会报错,而out型则不需要初始化
2).ref型传递变量,数值可以传入方法中,而out型无法将数据传入方法中。换而言之,ref型有进有出,out型只出不进。 -
out型参数
与ref型类似,仅用于传回结果。
注意:
1). out型数据在方法中必须要赋值,否则编译器会报错。
eg:如下图若将代码中的sum1方法的方法体
改为 a+=b;则编译器会报错。原因:out型只出不进,在没给a赋值前是不能使用的
改为 b+=b+2;编译器也会报错。原因:out型数据在方法中必须要赋值。
2). 重载方法时若两个方法的区别仅限于一个参数类型为ref 另一个方法中为out,编译器会报错
eg:如下图若将代码中
方法名sum1 改为sum(或者将方法名sum改为sum1),编译器会报错。
Error 1 Cannot define overloaded method ‘sum’ because it differs from another method only on ref and out
原因:参数类型区别仅限于 为ref 与为out 时,若重载对编译器而言两者的元数据表示完全相同。
具体区别见代码
class C { //1. in型参数 public void sum(int a, int b) { a += b; } //2. ref型参数 public void sum(ref int a, int b) { a += b; } //3. out型参数 public void sum1(out int a, int b) { a = b+2; } public static void Main(string[] args) { C c = new C(); int a = 1, b = 2; c.sum(a,b); Console.WriteLine("a:{0}", a); a = 1; b = 2; c.sum(ref a, b); Console.WriteLine("ref a:{0}", a); a = 1; b = 2; c.sum1(out a, b); Console.WriteLine("out a:{0}", a); } }
输出结果:
从代码也可以看出,in型参数为值传递,所以当将变量a传入方法时,变量a的值并不会发生变化。而ref型参数,由于是引用传递,将变量的值和地址都传入方法中故变量值改变。out型无法将变量的值传入。但可以将变量的地址传入并为该地址上的变量赋值。