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

相關文章
相關標籤/搜索