out,ref,params的区别

想要知道什么时候用到他们就必须先弄明白他们到底是什么,提到他们哥三个那就要说说方法参数了,如果在为方法声明参数时未使用 ref 或 out,则该参数可以具有关联的值。可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值。通过使用方法参数关键字,可以更改这种行为。下面的例子都是自己根据对比的方式展示给大家的

1)ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref关键字 eg:

[csharp]  view plain copy
  1. class RefExample  
  2. {  
  3.     static void Method(ref int i)  
  4.     {  
  5.         i = 44;  
  6.     }  
  7.     static void Main()  
  8.     {  
  9.         int val = 0;  
  10.         Method(ref val);  
  11.         //  现在val是44  
  12.     }  
  13. }  
  14.   
  15. //下面不用ref  
  16. class RefExample  
  17. {  
  18.     static void Method( int i)  
  19.     {  
  20.         i = 44;  
  21.     }  
  22.     static void Main()  
  23.     {  
  24.         int val = 0;  
  25.         Method(val);  
  26.         // 现在val是0  
  27.     }  
  28. }  

2) out 关键字会导致参数通过引用来传递。这与  ref 关键字类似,不同之处在于  ref 要求变量必须在传递之前进行初始化。若要使用  out 参数,方法定义和调用方法都必须显式使用  out关键字。eg:

[csharp]  view plain copy
  1. class OutExample  
  2. {  
  3.     static void Method(out int i)  
  4.     {  
  5.         i = 44;  
  6.     }  
  7. static void Method(ref int i)  
  8.     {  
  9.         i = 44;  
  10.     }  
  11. static void Method(int i)  
  12.     {  
  13.         i = 44;  
  14.     }  
  15.       
  16.     static void Main()  
  17.     {  
  18.         int value;  
  19.         Method(value);  
  20.        //在编译的时候都会报错:错误 CS0165: 使用了未赋值的局部变量“value”  
  21.         Method(refvalue);  
  22.       //在编译的时候都会报错:错误 CS0165: 使用了未赋值的局部变量“value”  
  23.         Method(out value);  
  24.         // value 现在是 44  
  25.     }  
  26. }  

3)params 关键字可以指定在参数数目可变处采用参数的方法参数。

在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。

[csharp]  view plain copy
  1. // cs_params.cs  
  2. using System;  
  3. public class MyClass   
  4. {  
  5.   
  6.     public static void UseParams(params int[] list)   
  7.     {  
  8.         for (int i = 0 ; i < list.Length; i++)  
  9.         {  
  10.             Console.WriteLine(list[i]);  
  11.         }  
  12.         Console.WriteLine();  
  13.     }  
  14.   
  15.     public static void UseParams2(params object[] list)   
  16.     {  
  17.         for (int i = 0 ; i < list.Length; i++)  
  18.         {  
  19.             Console.WriteLine(list[i]);  
  20.         }  
  21.         Console.WriteLine();  
  22.     }  
  23.   
  24.     static void Main()   
  25.     {  
  26.         UseParams(1, 2, 3);  
  27.         UseParams2(1, 'a'"test");   
  28.   
  29.         // An array of objects can also be passed, as long as  
  30.         // the array type matches the method being called.  
  31.         int[] myarray = new int[3] {10,11,12};  
  32.         UseParams(myarray);  
  33.     }  
  34. }  
  35.   
  36. //输出  
  37.   
  38. //1  
  39. //2  
  40. //3  
  41.   
  42. //1  
  43. //a  
  44. //test  
  45.   
  46. //10  
  47. //11  
  48. //12  

在使用params的时候注意的是,在有多于一个参数的情况下,params必须放在最后面,不然会编译不通过的。

在使用params的时候注意的是,在有多于一个参数的情况下,params必须放在最后面,不然会编译不通过的。

1>当我们频繁传递大型参数的时候,比如说DataTable、DataSet...的时候,会节省好多内存资源。(ref out 修饰的参数是传递引用(指针)的,传递引用的话 不至于你每次都去开辟另外一块内存来处理

2>当我们想得到方法多样化的处理结果的时候,而我们又不愿意复杂化方法所返回的结果,那么我们可以在方法里定义多个ref 或者 out,以期得到丰富的结果。比如说,我们调用一个方法,要同时得到string、int、double、bool、Array...等几种不同类型的结果,而return返回object又很复杂的时候,ref 和 out的处理效果,看上去自己会很帅...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值