it-swarm.com.de

Unterschied zwischen ref- und out-Parametern in .NET

Was ist der Unterschied zwischen den Parametern ref und out in .NET? In welchen Situationen kann einer nützlicher sein als der andere? Was wäre ein Code-Snippet, bei dem einer verwendet werden kann und ein anderer nicht?

398
ashwnacharya

Sie sind ziemlich gleich - der einzige Unterschied besteht darin, dass eine Variable, die Sie als out -Parameter übergeben, nicht initialisiert werden muss, sondern als ref -Parameter übergeben werden muss zu etwas.

int x;
Foo(out x); // OK

int y;
Foo(ref y); // Error: y should be initialized before calling the method

Ref Parameter sind für Daten, die geändert werden könnten, out Parameter sind für Daten, die eine zusätzliche Ausgabe für die Funktion darstellen (z. B. int.TryParse) die bereits den Rückgabewert für etwas verwenden.

490
Khoth

Warum hat C # sowohl 'ref' als auch 'out'?

Der Aufrufer einer Methode, die einen out-Parameter verwendet, muss der Variablen, die vor dem Aufruf als out-Parameter übergeben wurde, nicht zuweisen. Der Angerufene muss jedoch vor der Rückkehr den out-Parameter zuweisen.

Im Gegensatz dazu werden ref-Parameter vom Aufrufer als anfänglich zugewiesen betrachtet. Daher muss der Angerufene den ref-Parameter vor der Verwendung nicht zuweisen. Ref-Parameter werden in und aus einer Methode übergeben.

Also, out bedeutet raus, während ref für rein und raus steht.

Diese korrespondieren eng mit dem [out] und [in,out] -Parameter von COM-Schnittstellen. Die Vorteile von out -Parametern bestehen darin, dass Aufrufer ein vorab zugewiesenes Objekt nicht übergeben müssen, wenn es von der aufgerufenen Methode nicht benötigt wird Alle Kosten, die mit dem Marshalling verbunden sein könnten (eher mit COM, aber in .NET nicht ungewöhnlich).

128
Derek Park

Mit ref und out kann die aufgerufene Methode einen Parameter ändern. Der Unterschied zwischen ihnen ist, was passiert , bevor Sie den Anruf tätigen .

  • ref bedeutet, dass der Parameter einen Wert hat vor in die Funktion gehen. Die aufgerufene Funktion kann den Wert jederzeit lesen und/oder ändern. Der Parameter geht rein, dann kommt raus

  • out bedeutet, dass der Parameter vor dem Aufrufen der Funktion keinen offiziellen Wert hat. Die aufgerufene Funktion muss sie initialisieren. Der Parameter erlischt nur

Das sehe ich am liebsten so: ref übergibt Variablen als Referenz. out deklariert ein sekundäres Rückgabewert für die Funktion. Es ist so, als könntest du folgendes schreiben:

// This is not C#
public (bool, string) GetWebThing(string name, ref Buffer paramBuffer);

// This is C#
public bool GetWebThing(string name, ref Buffer paramBuffer, out string actualUrl);

Hier ist eine detailliertere Liste der Auswirkungen jeder Alternative:

Vor dem Aufruf der Methode:

ref: Der Aufrufer muss den Wert des Parameters setzen, bevor er ihn an die aufgerufene Methode übergibt.

out: Die Aufrufermethode muss den Wert des Arguments nicht festlegen, bevor die Methode aufgerufen wird. Höchstwahrscheinlich sollten Sie nicht. Tatsächlich wird jeder aktuelle Wert verworfen.

Während des Anrufs:

ref: Die aufgerufene Methode kann das Argument jederzeit lesen.

out: Die aufgerufene Methode muss den Parameter vor dem Lesen initialisieren.

Ferngespräche:

ref: Der aktuelle Wert wird zum Fernaufruf gemarshallt. Zusätzliche Leistungskosten.

out: Es wird nichts an den Fernaufruf übergeben. Schneller.

Technisch gesehen könnten Sie immer ref anstelle von out verwenden, aber mit out können Sie die Bedeutung des Arguments genauer bestimmen, und manchmal kann es sehr viel sein effizienter.

82
Euro Micelli

Beispiel für OUT: Die Variable wird nach dem Einstieg in die Methode mit einem Wert initialisiert. Später wird derselbe Wert an die Hauptmethode zurückgegeben.

namespace outreftry
{
    class outref
    {
        static void Main(string[] args)
        {
            yyy a = new yyy(); ;

            // u can try giving int i=100 but is useless as that value is not passed into
            // the method. Only variable goes into the method and gets changed its
            // value and comes out. 
            int i; 

            a.abc(out i);

            System.Console.WriteLine(i);
        }
    }
    class yyy
    {

        public void abc(out int i)
        {

            i = 10;

        }

    }
}

Ausgabe:

10

=============================================

Beispiel für Ref: Variable sollte vor dem Einstieg in die Methode initialisiert werden. Später wird derselbe oder geänderte Wert an die Hauptmethode zurückgegeben.

namespace outreftry
{
    class outref
    {
        static void Main(string[] args)
        {
            yyy a = new yyy(); ;

            int i = 0;

            a.abc(ref i);

            System.Console.WriteLine(i);
        }
    }
    class yyy
    {

        public void abc(ref int i)
        {
            System.Console.WriteLine(i);
            i = 10;

        }

    }
}

Ausgabe:

    0
    10

================================

Hoffe es ist jetzt klar.

16
kavta
  • Eine ref Variable muss initialisiert werden, bevor sie übergeben wird.
  • In Ihrer Funktionsimplementierung muss eine out -Variable festgelegt werden
  • out Parameter können als zusätzliche Rückgabevariablen betrachtet werden (keine Eingabe)
  • ref -Parameter können sowohl als Eingabe- als auch als Ausgabevariable betrachtet werden.
9
Brian R. Bondy

Ref- und Out-Parameter:

Die Parameter out und ref werden verwendet, um Werte in derselben Variablen zurückzugeben, die Sie als Argument einer Methode übergeben. Diese beiden Parameter sind sehr nützlich, wenn Ihre Methode mehr als einen Wert zurückgeben muss.

Sie müssen den out-Parameter im calee-Methodenkörper mit einem Wert versehen, sonst wird die Methode nicht kompiliert.


Ref Parameter: Muss vor der Übergabe an die Methode initialisiert werden. Das Schlüsselwort ref für einen Methodenparameter bewirkt, dass sich eine Methode auf dieselbe Variable bezieht, die als Eingabeparameter für dieselbe Methode übergeben wurde. Wenn Sie Änderungen an der Variablen vornehmen, werden diese in der Variablen wiedergegeben.

int sampleData = 0; 
sampleMethod(ref sampleData);

Ex of Ref Parameter

public static void Main() 
{ 
 int i = 3; // Variable need to be initialized 
 sampleMethod(ref i );  
}

public static void sampleMethod(ref int sampleData) 
{ 
 sampleData++; 
} 

Out Parameter: Es ist nicht erforderlich, vor der Übergabe an Method initialisiert zu werden. Der Parameter out kann verwendet werden, um die Werte in derselben Variablen zurückzugeben, die als Parameter der Methode übergeben wurde. Alle am Parameter vorgenommenen Änderungen werden in die Variable übernommen.

 int sampleData; 
 sampleMethod(out sampleData);

Ex of Out Parameter

public static void Main() 
{ 
 int i, j; // Variable need not be initialized 
 sampleMethod(out i, out j); 
} 
public static int sampleMethod(out int sampleData1, out int sampleData2) 
{ 
 sampleData1 = 10; 
 sampleData2 = 20; 
 return 0; 
} 

9
Krishna Thota

aus:

In C # kann eine Methode nur einen Wert zurückgeben. Wenn Sie mehr als einen Wert zurückgeben möchten, können Sie das Schlüsselwort out verwenden. Der Modifikator out gibt als Referenz zurück. Die einfachste Antwort ist, dass das Schlüsselwort "out" verwendet wird, um den Wert aus der Methode zu erhalten.

  • Sie müssen den Wert in der aufrufenden Funktion nicht initialisieren.
  • Sie müssen den Wert in der aufgerufenen Funktion zuweisen, sonst meldet der Compiler einen Fehler.

ref:

Wenn Sie in C # einen Werttyp wie int, float, double usw. als Argument an den Methodenparameter übergeben, wird dieser als Wert übergeben. Wenn Sie den Parameterwert ändern, wirkt sich dies daher nicht auf das Argument im Methodenaufruf aus. Wenn Sie den Parameter jedoch mit dem Schlüsselwort "ref" markieren, wird er in der tatsächlichen Variablen wiedergegeben.

  • Sie müssen die Variable initialisieren, bevor Sie die Funktion aufrufen.
  • Es ist nicht obligatorisch, dem ref-Parameter in der Methode einen Wert zuzuweisen. Wenn Sie den Wert nicht ändern, müssen Sie ihn dann als "ref" kennzeichnen.
7
Nazmul Hasan

out gibt an, dass der Parameter ein Ausgabeparameter ist, d. h. er hat keinen Wert, bis er von der Methode explizit festgelegt wird.

ref gibt an, dass der Wert eine Referenz ist, die einen Wert hat und deren Wert Sie innerhalb der Methode ändern können.

4
Alan

Ref-Parameter müssen in der Funktion nicht festgelegt werden, wohingegen out-Parameter vor dem Beenden der Funktion an einen Wert gebunden werden müssen. Als out übergebene Variablen können auch ohne Initialisierung an eine Funktion übergeben werden.

4
Patrick

out Parameter werden von der aufgerufenen Methode initialisiert, ref Parameter werden vor dem Aufruf der Methode initialisiert. Daher werden out -Parameter verwendet, wenn Sie nur einen sekundären Rückgabewert benötigen. ref -Parameter werden verwendet, um einen Wert abzurufen. nd geben möglicherweise eine Änderung an diesem Wert zurück (Sekundär zum Hauptrückgabewert).

1
bdukes

Mit dem Schlüsselwort ref werden Werte als Referenz übergeben. (Dies schließt nicht aus, dass die übergebenen Werte Werttypen oder Referenztypen sind.) Mit dem Schlüsselwort out angegebene Ausgabeparameter dienen zur Rückgabe von Werten aus einer Methode.

Ein wesentlicher Unterschied im Code besteht darin, dass Sie den Wert eines Ausgabeparameters innerhalb der Methode festlegen müssen. Dies ist bei ref-Parametern nicht der Fall.

Weitere Informationen finden Sie unter http://www.blackwasp.co.uk/CSharpMethodParameters.aspx

1
BlackWasp

Ein out Parameter ist ein ref Parameter mit einem speziellen Out() Attribut. Wenn ein Parameter für eine C # -Methode als out deklariert ist, muss der Parameter vom Compiler geschrieben werden, bevor er gelesen und die Methode zurückgegeben werden kann. Wenn C # eine Methode aufruft, deren Parameter ein Out() -Attribut enthält, gibt der Compiler zur Entscheidung, ob "undefinierte Variablen" -Fehler gemeldet werden sollen, vor, dass die Variable unmittelbar vor dem Aufrufen der Methode geschrieben wird. Beachten Sie, dass der Aufruf einer Routine mit einem Parameter out die betreffende Variable möglicherweise unberührt lässt, da andere .NET-Sprachen dem Attribut Out() nicht dieselbe Bedeutung zuweisen. Wenn eine Variable als out -Parameter verwendet wird, bevor sie definitiv zugewiesen wurde, generiert der C # -Compiler Code, um sicherzustellen, dass sie zu einem bestimmten Zeitpunkt vor ihrer Verwendung gelöscht wird Umfang gibt es keine Garantie, dass es wieder gelöscht wird.

1
supercat

Wenn in der Methodendeklaration ein out-Parameter deklariert ist, sollte der Methodenkörper der out-Variablen einen Wert zuweisen, bevor er zurückgibt. Es liegt also in der Verantwortung der aufgerufenen Methode, den Wert dem out-Parameter zuzuweisen, bevor er zurückgegeben wird.

Wenn in der Methode ein ref-Parameter deklariert ist, sollte das Argument, das beim Aufrufen der Methode übergeben wird, den Wert zugewiesen haben. Es liegt also in der Verantwortung des Aufrufers, den Wert für das ref-Argument zuzuweisen, bevor die Methode aufgerufen wird.

0
Ranganatha

out hat in C # 7 eine neue Syntax für mehr Succint erhalten https://docs.Microsoft.com/en-us/dotnet/articles/csharp/whats-new/csharp-7#more-expression-bodied- Mitglieder und noch aufregender ist die C # 7 Tuple-Verbesserungen, die eine elegantere Wahl als die Verwendung von ref und out IMHO sind.

0
Marc Ziss

ref wird wahrscheinlich auf null drosseln, da es vermutlich erwartet, ein vorhandenes Objekt zu ändern. out erwartet null, da es ein neues Objekt zurückgibt.

0
Joel Coehoorn

Dies Der out- und ref-Parameter in C # hat einige gute Beispiele.

Der grundlegende Unterschied besteht darin, dass out -Parameter bei der Übergabe nicht initialisiert werden müssen, während dies bei ref -Parametern der Fall ist.

0
casademora

out und ref sind identisch, mit der Ausnahme, dass out-Variablen nicht initialisiert werden müssen, bevor sie in den Abgrund gesendet werden. Ich bin nicht so schlau, ich habe das aus der MSDN-Bibliothek abgeschnitten :).

Um ihre Verwendung genauer zu beschreiben, hat der Modifikator jedoch die Bedeutung, dass out und ref auch die Referenz Ihrer aufrufenden Variablen ändern, wenn Sie die Referenz dieser Variablen in Ihrem Code ändern. Im folgenden Code ist die ceo-Variable eine Referenz auf newGuy, sobald sie vom Aufruf von doStuff zurückgegeben wird. Ohne ref (oder out) würde die Referenz nicht geändert.

private void newEmployee()
{
    Person ceo = Person.FindCEO();
    doStuff(ref ceo);
}

private void doStuff(ref Person employee)
{
    Person newGuy = new Person();
    employee = newGuy;
}
0
Jacob Proffitt

Sie sind auf subtile Weise unterschiedlich.

Ein out -Parameter muss nicht vom Angerufenen initialisiert werden, bevor er an die Methode übergeben wird. Daher jede Methode mit einem out -Parameter

  • Der Parameter kann nicht gelesen werden, bevor ihm ein Wert zugewiesen wurde
  • Muss ihm einen Wert zuweisen, bevor er zurückgegeben wird

Dies wird für eine Methode verwendet, die ihr Argument unabhängig von ihrem vorherigen Wert überschreiben muss.


Ein ref -Parameter muss vom Angerufenen initialisiert werden, bevor er an die Methode übergeben wird. Daher jede Methode mit einem ref -Parameter

  • Kann den Wert überprüfen, bevor er zugewiesen wird
  • Kann den ursprünglichen Wert unberührt zurückgeben

Dies wird für eine Methode verwendet, die (z. B.) ihren Wert prüfen und validieren oder normalisieren muss.

0
jpaugh