C#中ref和out的做用和区别

相同点:方法的定义和调用都必须显示使用ref、out关键字。都会致使参数按引用传递。web

不一样点:传递给ref关键字的参数必须赋初始值,而out不用。out关键字会清空变量,即便变量已经赋值也不行,退出函数时全部out引用个变量都要赋值。app

 

说明:ref的应用场景是内部对外部的值进行改变,而out则是内部对外部变量赋值。out通常用在函数有多个返回值。ide

 

 

[c-sharp]   view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. namespace aaa  
  6. {  
  7.     class Program  
  8.     {  
  9.         static void Main(string[] args)  
  10.         {  
  11.             int age = 22;//传递给ref定义参数的方法,因此必须赋初始值。  
  12.             A a = new A();  
  13.             a.GetStr(ref age);  
  14.             Console.WriteLine(age.ToString());//致使参数按引用传递,因此目标函数变量会直接被更改这个数值。  
  15.             int year;////传递给out定义参数的方法,不须要赋初始值。  
  16.             a.GetTest(out year);  
  17.             Console.WriteLine(year.ToString());//致使参数按引用传递,因此目标函数变量会直接被赋予这个数值。  
  18.             Console.Read();  
  19.         }  
  20.     }  
  21.     public class A  
  22.     {  
  23.         public void GetStr(ref int i)  
  24.         {  
  25.             i = 0;//ref修饰,能够修改也能够不改。  
  26.         }  
  27.         public void GetTest(out int i)  
  28.         {  
  29.             i = 100;//out修饰,必须在退出此方法前为out修饰的变量i赋值。  
  30.         }  
  31.     }  
  32. }  

  

尽管 ref  out 在运行时的处理方式不一样,但在编译时的处理方式相同。所以,若是一个方法采用 ref 参数,而另外一个方法采用 out 参数,则没法重载这两个方法。例如,从编译的角度来看,如下代码中的两个方法是彻底相同的,所以将不会编译如下代码:函数

class CS0663_Exampleoop

{this

    // Compiler error CS0663: "cannot define overloadedurl

    // methods that differ only on ref and out".spa

    public void SampleMethod(ref int i) { }.net

    public void SampleMethod(out int i) { }orm

}

可是,若是一个方法采用 ref  out 参数,而另外一个方法不采用这两个参数,则能够进行重载,以下例所示:

class RefOutOverloadExample

{

    public void SampleMethod(int i) { }

    public void SampleMethod(ref int i) { }

}

 

 

须要指出的是:
一、当咱们频繁传递大型参数的时候,好比说DataTable、DataSet...的时候,会节省好多内存资源。
二、当咱们想获得方法多样化的处理结果的时候,而咱们又不肯意复杂化方法所返回的结果,那么咱们能够在方法里定义多个ref 或者 out,以期获得丰富的结果。好比说,咱们调用一个方法,要同时获得string、int、double、bool、Array...等几种不一样类型的结果,而return返回object又很复杂的时候,ref 和out的处理效果,看上去将会是多么的赏心悦目...

 

此文章出处:

http://blog.csdn.net/qingyun1029/article/details/5943358

相关文章
相关标签/搜索