ref (C#-Referenz)

Das ref-Schlüsselwort bewirkt, dass Argumente als Verweis übergeben werden. Dies hat zur Folge, dass alle Änderungen am Methodenparameter in diese Variable übernommen werden, sobald die Steuerung wieder an die aufrufende Methode übergeben wird.

Tipp

Verwechseln Sie das Übergeben als Verweis nicht mit Verweistypen. Die beiden Konzepte sind nicht identisch. Ein Methodenparameter kann durch ref geändert werden, unabhängig davon, ob es ein Werttyp oder ein Verweistyp ist. Beim Übergeben als Verweis wird kein Werttypboxing durchgeführt.

Um einen ref-Parameter zu verwenden, müssen sowohl die Methodendefinition als auch die aufrufende Methode explizit das ref-Schlüsselwort verwenden. Beispiele:

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

Ein Argument, das an einen ref-Parameter übergeben wird, muss zunächst initialisiert werden. Dies unterscheidet sich von out, dessen Argumente nicht explizit initialisiert werden müssen, bevor sie übergeben werden. Weitere Informationen finden Sie unter out.

Obwohl das ref-Schlüsselwort und out-Schlüsselwort das Verhalten der Laufzeit verändern, werden sie zur Kompilierzeit nicht als Teil der Methodensignatur betrachtet. Daher können Methoden nicht überladen werden, wenn der Unterschied nur darin besteht, dass eine Methode ein ref-Argument annimmt und die andere Methode ein out-Argument. Daher kann das folgende Codebeispiel nicht kompiliert werden:

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

Die Überladung ist jedoch möglich, wenn eine Methode ein ref-Argument oder ein out-Argument annimmt und die andere Methode keines der beiden Argumente verwendet. Beispiel:

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

Eigenschaften sind keine Variablen. Es handelt sich vielmehr um Methoden. Daher ist keine Übergabe als ref-Parameter möglich.

Weitere Informationen zum Übergeben von Arrays finden Sie unter Übergeben von Arrays mithilfe von "ref" und "out" (C#-Programmierhandbuch).

Beispiel

Das oben veranschaulichte Übergeben von Werttypen als Verweis ist nützlich, aber ref kann auch zum Übergeben von Referenztypen verwendet werden. Auf diese Weise können die aufgerufenen Methoden das Objekt ändern, auf das der Verweis verweist, da der Verweis selbst als Verweis übergeben wird. Im folgenden Beispiel wird dargestellt, dass das Objekt selbst geändert werden kann, wenn ein Referenztyp als ref-Parameter übergeben wird. Weitere Informationen finden Sie unter Übergeben von Verweistypparametern (C#-Programmierhandbuch).

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#-Programmiersprachenspezifikation

Weitere Informationen finden Sie in der C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auch

Referenz

Übergeben von Parametern (C#-Programmierhandbuch)

Methodenparameter (C#-Referenz)

C#-Schlüsselwörter

Konzepte

C#-Programmierhandbuch

Weitere Ressourcen

C#-Referenz