类类型作为方法的参数时,使用 ref 和不使用ref的区别?

转自:http://topic.csdn.net/t/20060906/11/5002263.html

1,引用类型的变量不直接包含其数据;它包含的是对其数据的引用。当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。但是无法更改引用本身的值;也就是说,不能使用相同的引用为新类分配内存并使之在块外保持。若要这样做,应使用   ref   或   out   关键字传递参数。为了简单起见,下面的示例使用   ref。  
   
  示例:通过值传递引用类型  
  下面的示例演示通过值向   Change   方法传递引用类型的参数   arr。由于该参数是对   arr   的引用,所以有可能更改数组元素的值。但是,试图将参数重新分配到不同的内存位置时,该操作仅在方法内有效,并不影响原始变量   arr。  
   
  C#     复制代码    
  class   PassingRefByVal    
  {  
          static   void   Change(int[]   pArray)  
          {  
                  pArray[0]   =   888;     //   This   change   affects   the   original   element.  
                  pArray   =   new   int[5]   {-3,   -1,   -2,   -3,   -4};       //   This   change   is   local.  
                  System.Console.WriteLine("Inside   the   method,   the   first   element   is:   {0}",   pArray[0]);  
          }  
   
          static   void   Main()    
          {  
                  int[]   arr   =   {1,   4,   5};  
                  System.Console.WriteLine("Inside   Main,   before   calling   the   method,   the   first   element   is:   {0}",   arr   [0]);  
   
                  Change(arr);  
                  System.Console.WriteLine("Inside   Main,   after   calling   the   method,   the   first   element   is:   {0}",   arr   [0]);  
          }  
  }  
   
     
   
  输出  
  Inside   Main,   before   calling   the   method,   the   first   element   is:   1    
   
  Inside   the   method,   the   first   element   is:   -3    
   
  Inside   Main,   after   calling   the   method,   the   first   element   is:   888    
   
  代码讨论  
  在上个示例中,数组   arr   为引用类型,在未使用   ref   参数的情况下传递给方法。在此情况下,将向方法传递指向   arr   的引用的一个副本。输出显示方法有可能更改数组元素的内容,在这种情况下,从   1   改为   888。但是,在   Change   方法内使用   new   运算符来分配新的内存部分,将使变量   pArray   引用新的数组。因此,这之后的任何更改都不会影响原始数组   arr(它是在   Main   内创建的)。实际上,本示例中创建了两个数组,一个在   Main   内,一个在   Change   方法内。  
   
  示例:通过引用传递引用类型  
  本示例除在方法头和调用中使用   ref   关键字以外,其余与上个示例相同。方法内发生的任何更改都会影响调用程序中的原始变量。  
   
  C#     复制代码    
  class   PassingRefByRef    
  {  
          static   void   Change(ref   int[]   pArray)  
          {  
                  //   Both   of   the   following   changes   will   affect   the   original   variables:  
                  pArray[0]   =   888;  
                  pArray   =   new   int[5]   {-3,   -1,   -2,   -3,   -4};  
                  System.Console.WriteLine("Inside   the   method,   the   first   element   is:   {0}",   pArray[0]);  
          }  
                   
          static   void   Main()    
          {  
                  int[]   arr   =   {1,   4,   5};  
                  System.Console.WriteLine("Inside   Main,   before   calling   the   method,   the   first   element   is:   {0}",   arr[0]);  
   
                  Change(ref   arr);  
                  System.Console.WriteLine("Inside   Main,   after   calling   the   method,   the   first   element   is:   {0}",   arr[0]);  
          }  
  }  

2,区别在于ref能够修改对象地址,没有ref只能修改对象本身

3,简单来说:不用ref的话,只能改变当前实例的内容,而不能创建新实例。  
  比如:    
                  void   func1()  
                  {  
                          Class1   a   =   new   Class1();  
                          a.Property1   =   0;  
                          this.func2(a);  
                          Console.WriteLine(a.Property1);  
                  }  
                  void   func2(Class1   a)  
                  {  
                          a   =   new   Class1();  
                          a.Property1   =   10;  
                  }  
   
  输出仍然为0。如果func2使用了ref那么输出就为10。

posted @ 2009-06-16 13:26  农十四  阅读(418)  评论(0编辑  收藏  举报