好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#:ref和out的联系及区别。

C#:ref和out的联系及区别。

之前学习C#时候就遇到了这个问题,不过当时没有深究。昨晚想到这个问题时候自己尝试敲了敲代码,结果从运行的结果来看,越看越乱。在查看了一些资料的基础上,自己总结了一下。

可能会有点乱,但是自己总结出来的东西。

 

一: ref 关键字使参数按引用传递。

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

也即是说,在方法中对参数的设置和改变将会直接影响函数调用之处(代码①及②)。无论是函数的定义还是调用时均不可忽略关键字ref.

可以对比代码:

代码①:

  1   class   Program
   2       {
   3           static   void  Main( string  [] args)
   4           {
   5              Program pg =  new   Program();
   6               int  x =  10  ;
   7               int  y =  20  ;
   8              pg.GetValue( ref  x,  ref    y);
   9              Console.WriteLine( "  x={0},y={1}  "  , x, y);
  10  
 11               Console.ReadLine();
  12            
 13           }
  14  
 15           public   void  GetValue( ref   int  x,  ref   int   y)
  16           {
  17              x =  521  ;
  18              y =  520  ;
  19           }
  20      }

运行结果为  

代码② :

  1   class   Program
   2       {
   3           static   void  Main( string  [] args)
   4           {
   5              Program pg =  new   Program();
   6               int  x =  10  ;
   7               int  y =  20  ;
   8              pg.GetValue( ref  x,  ref    y);
   9              Console.WriteLine( "  x={0},y={1}  "  , x, y);
  10  
 11               Console.ReadLine();
  12            
 13           }
  14  
 15           public   void  GetValue( ref   int  x,  ref   int   y)
  16           {
  17              x =  1000  ;
  18              y =  1  ;
  19           }
  20      }

由代码① 和②的运行结果可以看出,在方法中对参数所做的任何更改都将反映在该变量中,而在main函数中对参数的赋值却没有起到作用, 这是不是说明不需要进行初始化呢?来看第二点

二:ref定义的参数在使用前必须初始化,无论在函数定义时候参数有没有赋予初值。这条正好区分out指定的参数可以不在调用函数的时候进行初始化。

来看代码③ 以及其运行结果:

  1    class   Program
   2       {
   3           static   void  Main( string  [] args)
   4           {
   5              Program pg =  new   Program();
   6               int   x;
   7               int  y;         //  此处x,y没有进行初始化,则编译不通过。 
  8              pg.GetValue( ref  x,  ref    y);
   9              Console.WriteLine( "  x={0},y={1}  "  , x, y);
  10  
 11               Console.ReadLine();
  12            
 13           }
  14  
 15           public   void  GetValue( ref   int  x,  ref   int   y)
  16           {
  17              x =  1000  ;
  18              y =  1  ;
  19           }    
  20      }

出现的错误为:使用了未赋值的局部变量“x”,“y”。 故可以说明ref指定的参数无论在函数定义的时候有没有赋予初值,在使用的时候必须初始化。

三 :对out来说,第一条同样适用。将代码①以及②中的ref全部修改成out,则可与使用ref得到同样的结果。

 

四:out指定的参数必须在函数定义的时候就赋初值。否则则出现错误。对比ref指定的参数则可以不在函数内部进行赋初值,在函数调用时候再赋初值也可以。

代码④:

  1   class   Program
   2       {
   3           static   void  Main( string  [] args)
   4           {
   5              Program pg =  new   Program();
   6               int  x= 10  ;
   7               int  y= 233  ;
   8              pg.Swap( out  x,  out   y);
   9              Console.WriteLine( "  x={0},y={1}  "  , x, y);
  10  
 11               Console.ReadLine();
  12            
 13           }
  14  
 15           public   void  Swap( out   int  a, out    int   b)
  16           {
  17              
 18               int  temp = a;    //  a,b在函数内部没有赋初值,则出现错误。 
 19              a =  b;
  20              b =  temp;
  21           }     
  22      
 23      }

出现错误:使用了未赋值的out参数“a”,"b"

则在swap函数定义时候给a,b赋上初值则运行正确。

 

总结以上四条得到ref和out使用时的区别是:

①:ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;

②:out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。

 

 

分类:  C#

标签:  C#知识

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于C#:ref和out的联系及区别。的详细内容...

  阅读:38次