Share via


ref (C# 參考)

更新:2007 年 11 月

ref 關鍵字會使引數以傳址方式傳遞。結果是此參數在方法中造成的任何變更,都會在控制權傳遞回到呼叫的方法時反映到該變數中。若要使用 ref 參數,方法定義和呼叫方法都必須明確使用 ref 關鍵字。例如:

class RefExample
{
    static void Method(ref int i)
    {
        i = 44;
    }
    static void Main()
    {
        int val = 0;
        Method(ref val);
        // val is now 44
    }
}

傳遞給 ref 參數的引數必須先被初始化。這點不同於 out,其引數並不需要在傳遞之前先明確初始化。如需詳細資訊,請參閱 out

雖然 ref 和 out 在執行階段被視為不同,但在編譯時期卻被視為相同。因此,若其中一個方法使用 ref 引數,而另一個方法使用 out 引數,就不能多載方法。例如,這兩個方法就編譯 (Compilation) 而言是相同的,因此這段程式碼將不會編譯:

class CS0663_Example
{
    // Compiler error CS0663: "Cannot define overloaded 
    // methods that differ only on ref and out".
    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }
}

然而,如果其中一個方法使用 ref 或 out 引數,另一個方法不使用任何引數,就可以完成多載,如下列範例所示:

class RefOverloadExample
{
    public void SampleMethod(int i) { }
    public void SampleMethod(ref int i) { }
}

屬性不是變數,所以不能做為 ref 參數傳遞。

如需如何傳遞陣列的詳細資訊,請參閱使用 ref 和 out 傳遞陣列 (C# 程式設計手冊)

範例

如本主題前述內容所示範,以傳址方式傳遞型別是很有用的,而且 ref 對於剖析參考型別 (Reference Type) 也非常有用。這可讓被呼叫的方法修改參考所參照的物件,因為參考本身是以傳址方式傳遞。下列範例示範當參考型別是當做 ref 參數傳遞時,物件可以自行變更。

class RefExample2
{
    static void Method(ref string s)
    {
        s = "changed";
    }
    static void Main()
    {
        string str = "original";
        Method(ref str);
        Console.WriteLine(str);
    }
}
// Output: changed

C# 語言規格

如需詳細資料,請參閱 C# 語言規格中的下列章節:

  • 5.1.5 參考參數

  • 10.6.1.2 參考參數

請參閱

概念

C# 程式設計手冊

參考

傳遞參數 (C# 程式設計手冊)

方法參數 (C# 參考)

C# 關鍵字

其他資源

C# 參考