共用方式為


ref (C# 參考)

ref 關鍵字會使引數以傳址方式傳遞。 結果是此參數在方法中造成的任何變更,都會在控制權傳遞回到呼叫的方法時反映到該變數中。

注意事項注意事項

請混淆傳址 (By Reference) 的概念以及參考型別 (Reference Type) 的概念。 這兩個概念並不相同。 無論方法參數是實值型別或參考型別,皆可由 ref 修改。 以傳址 (By Reference) 方式傳遞實值型別時,不會發生實值型別的 Boxing。

若要使用 ref 參數,方法定義和呼叫方法都必須明確使用 ref 關鍵字。 例如:

    class RefExample
    {
        static void Method(ref int i)
        {
            // Rest the mouse pointer over i to verify that it is an int.
            // The following statement would cause a compiler error if i
            // were boxed as an object.
            i = i + 44;
        }

        static void Main()
        {
            int val = 1;
            Method(ref val);
            Console.WriteLine(val);

            // Output: 45
        }
    }

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

雖然 ref 與 out 關鍵字會產生不同的執行階段行為,但是在編譯期間它們並不被視為方法簽章的一部分。 因此,如果唯一的差別在於其中一個方法使用 ref 引數,而另一個方法使用 out 引數,則不能多載方法。 例如,下列程式碼將無法編譯:

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) { }
    }

屬性 (Property) 不是變數, 它們其實是方法,因而無法做為 ref 參數傳遞。

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

範例

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

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# 語言規格。 語言規格是 C# 語法和用法的決定性來源。

請參閱

參考

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

方法參數 (C# 參考)

C# 關鍵字

概念

C# 程式設計手冊

其他資源

C# 參考