天天看點

C# out、ref關鍵字的用法和差別

首先:兩者都是按位址傳遞的,使用後都将改變原來參數的數值。

其次:ref可以把參數的數值傳遞進函數,但是out是要把參數清空,就是說你無法把一個數值從out傳遞進去的,out進去後,參數的數值為空,是以你必須初始化一次。這個就是兩個的差別,或者說就像有的網友說的,ref是有進有出,out是隻出不進。

out:

class Program  
{  
    /* 
     * out、ref都是引用傳遞,傳遞後使用都會改變原有的值 
     * out是隻出不進。ref是有進有出, 
     *  
     * out用法,一般用于需要傳回多個參數時,如在需要傳回分頁的資料時 同時傳回總條數或者TryParse()會用到 
     * ref用法,一般用于在改變一個參數時,把他的改變反應到變量中 如在遞歸中 
     *  
     */  
  #region Out  
    static void Main(string[] args)  
    {  
        Program p = new Program();  
  
        //out傳遞參數時不用指派(如果指派也會被清空)  
        string out_s;  
        p.out_func(out out_s);  
        Console.WriteLine(out_s);  
  
  
        Console.ReadLine();//暫停視窗  
    }  
  
    /// <summary>  
    /// out傳入後需要指派才能傳回  
    /// </summary>  
    /// <param name="i"></param>  
    public void out_func(out string s)  
    {  
        s = "out參數已指派,傳回。";  
    }  
  #endregion  
}  
           
C# out、ref關鍵字的用法和差別

ref:

class Program  
   {  
     #region ref  
       static void Main(string[] args)  
       {  
           Program p = new Program();  
           
           //ref傳遞時如果未初始化指派 則會報錯 :使用了未指派的局部變量“ref_s”      
           string ref_s = "已初始化。";  
           p.ref_func(ref ref_s);  
           Console.WriteLine("傳回的ref參數:" + ref_s);  
  
  
           Console.ReadLine();//暫停視窗  
       }  
  
       /// <summary>  
       /// ref傳入前需要指派,傳入後可不做操作傳回原值  
       /// </summary>  
       /// <param name="s"></param>  
       public void ref_func(ref string s)  
       {  
           Console.WriteLine("傳入的ref參數:" + s);  
           s += "已指派傳回。";  
       }  
       
     #endregion  
   }  
           
C# out、ref關鍵字的用法和差別

總結起來ref與out差别就是:

  1. ref在傳給方法前需要初始化,out不需要。
  2. out在方法内必須被指派,否則會出現編譯錯誤。
  3. out在傳給方法時會被還原至未初始化狀态,是以在方法執行前對out參數進行初始化和不進行的效果上是一樣的。
c#