这三个关键字都是用来修饰参数的,并且如果方法中使用了相应的关键字,在调用方法的时候,也必须加上使用的关键字。
在c#中,函数中的参数如果按照值类型的方式去传递,则在该函数执行完毕后,不会改变原来的实际参数的值。
ref和out关键字的作用就是,如果参数按照值类型的方式去传递,则在函数执行完毕后,会改变原来的实参。
如下列代码
int a = 20;//一个值类型的变量 public void Number(int aa)//aa是形参 { aa = 50; } Number(a);//将实参a传入到方法Number中去 Console.WriteLine(a); 输出的结果 是 20,而不是50,//因为a是值类型,虽然方法内形参aa赋值50,但是他只方法结束后,a的值不会被形参改变。在值类型传递的时候,会对参数进行复制,在函数内部操作的那个实际上是复制品,所有它不会改变本尊的值。
使用ref关键字 int a = 20; public void Number(ref int aa) { aa = 50; } Number(ref a)//调用的时候要加上ref Console.WriteLine(a); 输出的结果是50,而不是20。//因为使用了ref关键字,虽然是值类型的传递,但是ref关键字会将a的地址传递给aa,所以方法内部对aa的赋值实际上就是对a的赋值。
int a; public void Number(out int aa)//aa是形参 { aa = 50; } Number(out a);//将实参a传入到方法Number中去 Console.WriteLine(a);
ref关键字修饰的变量,1.必须是已经赋值过的,2.但是可以不用在函数内部再次赋值,可以直接使用。 如 int a =20; public void Number(ref int aa) { Console.Writeline(aa); } out关键字修饰的变量,1.不需要提前进行赋值,2.但是必须在使用的函数内部进行赋值 如 int a; //声明了变量a,但是没有赋值 public void Number(out int aa)//aa是形参 { aa = 50; ------必须在函数内部赋值, }
所以这就是为什么ref修饰的参数,必须在外部赋值过,而out修饰的参数,必须在内部赋值过,即使out修饰的参数已经在外部赋值,也必须在内部再次赋值才行。这也就是二者的唯一区别。
补充:方法的重载不能通过这两个关键字去区分,如代码块1,但是可以区别一个带ref或者out的,与一个不带ref或者out的如代码2,in关键字也是一样的,没有列出来。
代码1 class CS0663_Example { // Compiler error CS0663: "Cannot define overloaded // methods that differ only on ref and out". public void SampleMethod(out int i) { } public void SampleMethod(ref int i) { } }
代码2 class RefOverloadExample { public void SampleMethod(int i) { } public void SampleMethod(ref int i) { } }
它和out和ref关键字的作用是一样的,都是将参数按照引用来传递,区别就是调用In关键字的方法,无法改变其值。如
int readonlyArgument = 44; void InArgExample(in int number) { Uncomment the following line to see error CS8331 number = 19;//此处是错误的!!!,无法在函数内部改变In关键字修饰的参数值 }
以上均是个人理解,发出来就是希望有错误的地方能得到指正,万分感谢!!!