当前位置:编程学习 > C#> 正文

ref和out区别有哪些

时间:2014-7-16类别:编程学习

ref和out区别有哪些

ref和out区别有哪些
  •  
  • 一、ref    
        
    通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响.此外我们还有其他向方法传递参数的形式,引用(ref)和输出(out).
        
    有时,我们需要改变原来变量中的值,这时,我们可以向方法传递变量的引用,而不是变量的值.引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值.变量的值存储在内存中,可以创建一个引用,他指向变量在内存中的位置.当引用被修改时,修改的是内存中的值,因此变量的值可以将被修改.当我们调用一个含有引用参数的方法时,方法中的参数将指向被传递给方法的相应变量,因此,我们会明白,为什么当修改参数变量的修改也将导致原来变量的值.
  •  
  •  
  • 二、out
        
    通过指定返回类型,可以从方法返回一个值,有时候(也许还没遇到,但是我们应该有这么个方法),需要返回多个值,虽然我们可以使用ref来完成,但是C#专门提供了一个属性类型,关键字为out.
  •  
  •  
  •  
  •  
  • 三、C#中out与ref区别
  •  
    1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
  • 2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。

    3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

    4、ref传进去的参数在函数内部可以直接使用,而out不可。

    5、系统对ref的限制是更少一些的。out虽然不要求在调用前一定要初始化,但是其值在函数内部是不可见的,也就是不能使用通过out传进来的值,并且一定要在函数内赋一个值。或者说函数承担初始化这个变量的责任。

    6、若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。

    7、当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。

     

    四、ref实例

  •  
  • C# 代码   复制
  • 
     using System;
     class M
     {
       public void F(ref int i)
       {
         i=3;
       }
     }
    
     class Test
     {
       int i=0; //要作为引用参数传递的变量必须明确赋值
       static void Main()
       { //不能把int i=0;放在这里赋值,会报错说Test不包含i定义。
         Test t=new Test();
         Console.WriteLine("the value of i is:{0}",t.i);
         M mm=new M();
         mm.F(ref t.i); //作为引用参数传递
         Console.WriteLine("now the value of i is :{0}",t.i); //i的值改变
       }
    }
    
    		
  •  

    五、out实例

  •  
  • C# 代码   复制
  • 
    class M
    {
      public void F(out int i) //这个方法和ref的方法都是一样,没什么不同
      {
        i = 8; //返回前必须明确赋值
      }
     }
      class Test
    {
      int i; //不用赋初值,这就是out和ref的区别,但声明还是要的
      public static void Main()
      {
        Test t1 = new Test();
        Console.WriteLine("the value of i is :{0}", t1.i); //输出是0;
        M m1 = new M();
        m1.F(out t1.i); //i作为输出参数传递 ,输出是8
        Console.WriteLine("now value of i is :{0}", t1.i);
    
    
      }
    			

        }

  •  

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐