黑马程序员--学习ref、out和params的区别

  如果在为方法声明参数时未使用 ref 或 out ,则该参数可以具有关联的值。可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值。通过使用方法参数关键字,可以更改这种行为。

例子:

1)ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。

 

      class RefExample  

       {  

           static void Method(ref int i)  

           {  

               i = 11;  

           }  

           static void Main()  

           {  

              int val = 0;  

             Method(ref val);  

             //  现在val是11  

            }  

          }  

  

         //下面不用ref   

         class RefExample  

         {  

           static void Method( int i)  

           {  

               i = 11;  

           }  

           static void Main()  

           {  

              int val = 0;  

            Method(val);  

            // 现在val是0   

           }  

          }  


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

 

 

        class OutExample  

        {  

            static void Method(out int i)  

            {  

                  i = 11;  

            }  

          static void Method(ref int i)  

           {  

                 i = 11;  

           }  

        static void Method(int i)  

          {  

                   i = 11;  

          }  

      

           static void Main()  

          {  

               int value;  

              Method(value);  

             //在编译的时候都会报错:使用了未赋值的局部变量“value”   

             Method(refvalue);  

            //在编译的时候都会报错: 使用了未赋值的局部变量“value”   

            Method(out value);  

            // value 现在是 11 

             }  

         }  

 

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必须放在最后面,不然会编译不通过的。

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

2>当我们想得到方法多样化的处理结果的时候,而我们又不愿意复杂化方法所返回的结果,那么我们可以在方法里定义多个ref 或者 out,以期得到丰富的结果。

 

posted @ 2012-11-24 14:39  韩俊  阅读(108)  评论(0)    收藏  举报