想要知道什么时候用到他们就必须先弄明白他们到底是什么,提到他们哥三个那就要说说方法参数了,如果在为方法声明参数时未使用 ref 或 out,则该参数可以具有关联的值。可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值。通过使用方法参数关键字,可以更改这种行为。下面的例子都是自己根据对比的方式展示给大家的
1)ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref关键字 eg:
- class RefExample
- {
- static void Method(ref int i)
- {
- i = 44;
- }
- static void Main()
- {
- int val = 0;
- Method(ref val);
- // 现在val是44
- }
- }
- //下面不用ref
- class RefExample
- {
- static void Method( int i)
- {
- i = 44;
- }
- static void Main()
- {
- int val = 0;
- Method(val);
- // 现在val是0
- }
- }
2) out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out关键字。eg:
- class OutExample
- {
- static void Method(out int i)
- {
- i = 44;
- }
- static void Method(ref int i)
- {
- i = 44;
- }
- static void Method(int i)
- {
- i = 44;
- }
- static void Main()
- {
- int value;
- Method(value);
- //在编译的时候都会报错:错误 CS0165: 使用了未赋值的局部变量“value”
- Method(refvalue);
- //在编译的时候都会报错:错误 CS0165: 使用了未赋值的局部变量“value”
- Method(out value);
- // value 现在是 44
- }
- }
3)params 关键字可以指定在参数数目可变处采用参数的方法参数。
在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
- // cs_params.cs
- using System;
- public class MyClass
- {
- public static void UseParams(params int[] list)
- {
- for (int i = 0 ; i < list.Length; i++)
- {
- Console.WriteLine(list[i]);
- }
- Console.WriteLine();
- }
- public static void UseParams2(params object[] list)
- {
- for (int i = 0 ; i < list.Length; i++)
- {
- Console.WriteLine(list[i]);
- }
- Console.WriteLine();
- }
- static void Main()
- {
- UseParams(1, 2, 3);
- UseParams2(1, 'a', "test");
- // An array of objects can also be passed, as long as
- // the array type matches the method being called.
- int[] myarray = new int[3] {10,11,12};
- UseParams(myarray);
- }
- }
- //输出
- //1
- //2
- //3
- //1
- //a
- //test
- //10
- //11
- //12
在使用params的时候注意的是,在有多于一个参数的情况下,params必须放在最后面,不然会编译不通过的。
在使用params的时候注意的是,在有多于一个参数的情况下,params必须放在最后面,不然会编译不通过的。
1>当我们频繁传递大型参数的时候,比如说DataTable、DataSet...的时候,会节省好多内存资源。(ref out 修饰的参数是传递引用(指针)的,传递引用的话 不至于你每次都去开辟另外一块内存来处理)
2>当我们想得到方法多样化的处理结果的时候,而我们又不愿意复杂化方法所返回的结果,那么我们可以在方法里定义多个ref 或者 out,以期得到丰富的结果。比如说,我们调用一个方法,要同时得到string、int、double、bool、Array...等几种不同类型的结果,而return返回object又很复杂的时候,ref 和 out的处理效果,看上去自己会很帅...