ref (C#-Referenz)

Das ref-Schlüsselwort wird ein Argument, durch einen Verweis, nicht durch einen Wert übergeben wird.Die Auswirkung des Übergebens von Verweis kann, dass jeder Änderung am Parameter in der - Methode in der zugrunde liegenden Argumentvariable im Aufruf von Methoden wiedergegeben wird.Der Wert eines Verweisparameters ist immer der selbe wie der Wert der zugrunde liegenden Argumentvariable.

HinweisHinweis

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 die Methodendefinition und der Aufruf von Methoden ref das Schlüsselwort, wie im folgenden Beispiel gezeigt explizit verwenden.

    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 einem ref-Parameter übergeben wird, muss initialisiert werden, bevor es übergeben wird.Dies unterscheidet sich von out-Parametern, deren Argumente nicht explizit initialisiert werden müssen, bevor sie übergeben werden.Weitere Informationen finden Sie unter out.

Member einer Klasse können Signaturen aufweisen, die nur von ref und out unterscheiden.Ein Kompilierungsfehler tritt auf, wenn der einzige Unterschied zwischen zwei Member eines Typs ist, dass einer dieser einen ref-Parameter hat und die andere einen out-Parameter verfügt.Der folgende Code beispielsweise nicht kompiliert.

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

kann jedoch das Überladen, wenn eine Methode ref, oder hat out-Parameter und die andere einen Wertparameter verfügte, wie im folgenden Beispiel gezeigt durchgeführt werden.

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

In anderen Situationen, die übereinstimmende Signatur, die wie Ausblenden oder Überschreiben, ref und out benötigen, sind Teil der Signatur und gleichen nicht ab.

Eigenschaften sind keine Variablen.Sie sind Methoden und können nicht in ref-Parametern übergeben werden.

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

Sie können die ref und out Schlüsselwörter für die folgenden Arten von Methoden nicht verwenden:

  • Async-Methoden, die Sie definieren, indem Sie den async-Modifizierer verwenden.

  • Iteratormethoden, die eine Rendite oder yield break-Anweisung enthalten.

Beispiel

Die vorherigen Beispiele zeigen, was geschieht, wenn Sie Werttypen als Verweis übergeben.Sie können das - Schlüsselwort ref auch verwenden, um Verweistypen zu übergeben.Das Übergeben eines Referenztyps als Verweis aktiviert die aufgerufene Methode, um das Objekt zu ändern, zu dem der Verweisparameter verweist.Der Speicherort des Objekts wird an die - Methode als Wert des Verweisparameters übergeben.Wenn Sie den Speicherort des Parameters ändern, ändern Sie den Speicherort des zugrunde liegenden Arguments.Im folgenden Beispiel wird eine Instanz eines Referenztyps als ref-Parameter.Weitere Informationen dazu, wie Verweistypen einen Wert und durch einen Verweis, finden Sie unter Übergeben von Verweistypparametern (C#-Programmierhandbuch) führt.

class RefExample2
{
    static void ChangeByReference(ref Product itemRef)
    {
        // The following line changes the address that is stored in  
        // parameter itemRef. Because itemRef is a ref parameter, the
        // address that is stored in variable item in Main also is changed.
        itemRef = new Product("Stapler", 99999);

        // You can change the value of one of the properties of
        // itemRef. The change happens to item in Main as well.
        itemRef.ItemID = 12345;
    }

    static void Main()
    {
        // Declare an instance of Product and display its initial values.
        Product item = new Product("Fasteners", 54321);
        System.Console.WriteLine("Original values in Main.  Name: {0}, ID: {1}\n",
            item.ItemName, item.ItemID);

        // Send item to ChangeByReference as a ref argument.
        ChangeByReference(ref item);
        System.Console.WriteLine("Back in Main.  Name: {0}, ID: {1}\n",
            item.ItemName, item.ItemID);
    }
}

class Product
{
    public Product(string name, int newID)
    {
        ItemName = name;
        ItemID = newID;
    }

    public string ItemName { get; set; }
    public int ItemID { get; set; }
}

// Output: 
//Original values in Main.  Name: Fasteners, ID: 54321

//Back in Main.  Name: Stapler, ID: 12345

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