C# ref & out关键字
C# ref & out关键字
ref关键字
ref 关键字会导致参数通过引用传递,而不是通过值传递。 通过引用传递的效果是,对所调用方法中的参数进行的任何更改都反映在调用方法中。例如,如果调用方传递本地变量表达式或数组元素访问表达式,所调用方法会将对象替换为 ref 参数引用的对象,然后调用方的本地变量或数组元素将开始引用新对象。
ref关键字的使用
若要使用 ref 参数,方法定义和调用方法均必须显式使用 ref 关键字,如下面的示例所示:
1 class Program 2 { 3 static void Ride(ref int num) 4 { 5 num = num * 10; 6 } 7 8 static void Main(string[] args) 9 { 10 int num = 10; 11 Ride(ref num); 12 Console.WriteLine(num);//结果为100 13 } 14 }
- ref关键字是用来修饰方法的参数的
- 在调用的时候。在为被ref修饰的形参传值的时候,实参前面也必须要用ref修饰。
- 传值的时候,传递的不是实参变量的值,传递的是实参变量的地址。这个时候在方法的内部,修改ref形参的值,其实改的是实参变量的值。
- 实参必须是1个变量,不能是1个常量。因为传递的时候传的是变量的地址,而不是值。
最大的作用是:可以在方法的内部去修改调用者的变量的值。实际上,我们发现ref传递以后,实参ref和形参ref 就是同1个变量. 这个时候 在方法的内部,修改ref形参的值 就是修改实参变量的值 因为本质上他们是同1个变量。
out关键字
out 关键字通过引用传递参数。这与 ref 关键字相似,只不过 ref 要求在传递之前初始化变量。若要使用 out 参数,方法定义和调用方法均必须显式使用 out 关键字。
out关键字的使用
1 class Program 2 { 3 static void Add(out int num) 4 { 5 num = 10; 6 num += 10; 7 } 8 9 static void Main(string[] args) 10 { 11 int num; 12 Add(out num); 13 Console.WriteLine(num);//结果为20 14 } 15 }
- out关键字是用来修饰方法的参数的。调用的是,实参的时候,实参必须是1个变量,并且实参也是被out修饰。
- 如果加了out关键字,那么在传递的时候,传递的不是实参变量的值,而是实参变量的地址。所以在方法的内部,修改out形参,实际上修改的是调用者的实参变量的值。
- 实际上,我们发现out传递以后,实参out和形参out就是同一个变量。这个时候 在方法的内部,修改out形参的值,就是修改实参变量的值,因为本质上他们是同个变量。
out最大的作用是:可以在方法的内部更改调用者的变量的值。当我们需要向调用者返回多个数据的时候,就可以用它。
ref与out的区别
- ref在方法的内部可以为其赋值,也可以不赋值。out要求在方法结束之前必须为它赋值。
- ref实参变量在传递之前,要求必须有初始值,因为在方法的内部有可能会使用它的值。
- out实参变量在传递之前,可以没有初始值,因为在方法的内部一定会为它赋值的。
- out在方法中,使用之前,必须为其赋值。
- ref侧重于修改,out侧重于输出。
什么时候用ref关键字,什么时候用out关键字?
- 如果方法的内部有可能返回多个数据,那么我们就可以使用ref。
- 如果方法一定会返回多个数据,那么我们就可以使用out。
- 但是ref是可以用在任意的场合的。