天天看點

C#關鍵字out與ref的差別

問題:為什麼C#中要有ref和out?

先看下面一段代碼:想通過Exchange方法交換A、B兩個變量的值,交換前A=10,B=20.

static void Main(string[] args)
{
    int A = 10;
    int B = 20;
    Exchange(A,B);
    Console.WriteLine($"交換後,A為{A},B為{B}");
}
//交換A、B的值
private static void Exchange(int A, int B)
{
    int temp = A;
    A = B;
    B = temp;
}
           
C#關鍵字out與ref的差別

運作結果顯示A、B的值并未交換,原因是因為值類型的A、B傳遞的是棧中資料的拷貝,而非A、B本身在棧中的位址(引用)。

解決方案:是以,C#中提出了ref 和out兩個關鍵字。

利用ref修改代碼如下即可實作A和B的交換:

static void Main(string[] args)
{
    int A = 10;
    int B = 20;
    Exchange(ref A,ref B);
    Console.WriteLine($"交換後,A為{A},B為{B}");
}
//交換A、B的值
private static void Exchange(ref int A,ref int B)
{
    int temp = A;
    A = B;
    B = temp;
}
           
C#關鍵字out與ref的差別

使用ref、out注意什麼?

先看以下代碼:

C#關鍵字out與ref的差別

代碼編譯後,報錯如下:

C#關鍵字out與ref的差別

從編譯的角度看,使用ref時,必須在方法調用之前要初始化。而使用out時,必須在方法裡面進行初始化。

ref(C# 參考)

MSDN的定義:The 

ref

 keyword indicates a value that is passed by reference。表示ref是通過引用來傳遞參數。ref也是Reference的縮寫。

其效果是,當變量傳遞到方法時,在方法中對參數的任何更改都将反映在該變量中。如果要使用 ref 參數,則在定義的方法以及調用該方法時都必須使用 ref 關鍵字來修飾參數。

注意:傳遞給ref的參數,在調用方法前必須先初始化。在被調用函數内,ref引入的參數在傳回前不必為其賦初值。

out(C# 參考)

MSDN的定義:The 

out

 keyword causes arguments to be passed by reference。表示out作為一個參數修飾符,允許你通過引用而不是通過值将參數傳遞給方法。

out 關鍵字會導緻參數通過引用來傳遞。這與 ref 關鍵字類似,不同之處在于 ref 要求變量必須在傳遞之前進行初始化。如果要使用 out 參數,方法定義和調用方法都必須顯式使用 out 關鍵字來修飾參數。

注意:盡管作為 out 參數傳遞的變量不必在傳遞之前進行初始化,但需要在被調用函數内,out引入的參數在傳回前至少指派一次。

關于重載:有out|ref關鍵字的方法可以與無out和ref關鍵字的方法構成重載;但如想在out和ref間重載,編譯器将提示:不能定義僅在ref和out的上的方法重載。充分說明out和ref的差別僅是編譯器角度的,他們生成的IL代碼是一樣的。

繼續閱讀