Unterschied zwischen Ref- und Out-Parametern in .NET

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

Sie sind ziemlich gleich – der einzige Unterschied ist, dass eine Variable, die Sie als out Parameter übergeben, nicht initialisiert werden muss, sondern als ref Parameter übergeben werden muss.

 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 modifiziert werden können, out Parameter sind für Daten, die eine zusätzliche Ausgabe für die function sind (zB int.TryParse ), die bereits den Rückgabewert für etwas verwenden.

Warum hat C # sowohl ‘ref’ als auch ‘out’?

Der Aufrufer einer Methode, die einen out-Parameter akzeptiert, muss nicht der Variablen zugewiesen werden, die vor dem Aufruf als out-Parameter übergeben wurde. Der Angerufene muss jedoch vor der Rückgabe dem Ausgangsparameter zugewiesen werden.

Im Gegensatz dazu werden ref-Parameter als anfänglich vom Anrufer zugewiesen betrachtet. Daher muss der Angerufene den ref-Parameter vor der Verwendung nicht zuordnen. Ref-Parameter werden sowohl innerhalb als auch außerhalb einer Methode übergeben.

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

Diese entsprechen weitgehend den Parametern [out] und [in,out] von COM-Schnittstellen, wobei die Vorteile von out Parametern darin bestehen, dass Anrufer ein zuvor zugewiesenes Objekt nicht passieren müssen, wenn es von der aufgerufenen Methode nicht benötigt wird sowohl die Kosten für die Zuweisung als auch alle Kosten, die mit dem Marshalling verbunden sind (wahrscheinlicher mit COM, aber nicht ungewöhnlich in .NET).

ref und out 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, bevor er in die function geht. Die aufgerufene function kann den Wert jederzeit lesen und ändern. Der Parameter geht rein und kommt dann heraus

  • out bedeutet, dass der Parameter keinen offiziellen Wert hat, bevor er in die function geht. Die aufgerufene function muss sie initialisieren. Der Parameter erlischt nur

Hier ist meine bevorzugte Art, es zu betrachten: ref ist es, Variablen als Referenz zu übergeben. out besteht darin, einen sekundären Rückgabewert für die function zu deklarieren. Es ist wie wenn du das schreiben könntest:

 // 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 der einzelnen Alternativen:

Bevor Sie die Methode aufrufen:

ref : Der Aufrufer muss den Wert des Parameters vor der Übergabe an die aufgerufene Methode festlegen.

out : Die Aufrufermethode ist nicht erforderlich, um den Wert des Arguments vor dem Aufruf der Methode festzulegen. Wahrscheinlich 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.

Ferngesteuerte Anrufe:

ref : Der aktuelle Wert wird zum Remote-Anruf geleitet. Zusätzliche performanceskosten

out : Dem Remote-Aufruf wird nichts übergeben. Schneller.

Technisch gesehen, könnte man immer ref anstelle von out , aber out ermöglicht es Ihnen, genauer über die Bedeutung des Arguments zu sein, und manchmal kann es viel effizienter sein.

Beispiel für OUT: Die Variable ruft den Wert ab, nachdem sie in die Methode übernommen wurde. Später wird der gleiche 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: Die Variable sollte vor dem Einstieg in die Methode initialisiert werden. Später wird der gleiche Wert oder modifizierte 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.

  • Eine ref Variable muss initialisiert werden, bevor sie übergeben wird.
  • In Ihrer functionsimplementierung muss eine out Variable gesetzt werden
  • out Parameter können als zusätzliche Return-Variablen (keine Eingabe) gedacht werden
  • ref Parameter können sowohl als Eingangs- als auch als Ausgangsvariablen betrachtet werden.

Ref und Out Parameter:

Die Parameter out und ref geben Werte in derselben Variablen zurück, 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 dem Parameter out in calee method body einen Wert zuweisen, andernfalls wird die Methode nicht kompiliert.


Ref-Parameter: Es muss initialisiert werden, bevor es an die Methode übergeben wird. Das Schlüsselwort ref in einem Methodenparameter bewirkt, dass eine Methode auf dieselbe Variable verweist, die als Eingabeparameter für dieselbe Methode übergeben wurde. Wenn Sie Änderungen an der Variablen vornehmen, werden sie in der Variablen widergespiegelt.

 int sampleData = 0; sampleMethod(ref sampleData); 

Ex des Ref-Parameters

 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 notwendig, vor der Übergabe an Method initialisiert zu werden. Der out Parameter kann verwendet werden, um die Werte in derselben Variablen zurückzugeben, die als Parameter der Methode übergeben wurden. Alle Änderungen am Parameter werden in der Variablen widergespiegelt.

  int sampleData; sampleMethod(out sampleData); 

Ex von 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; } 

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 out-Modifikator wird als Rückgabewert zurückgegeben. 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 function nicht initialisieren.
  • Sie müssen den Wert in der aufgerufenen function zuweisen, andernfalls 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 Wert übergeben. Wenn Sie den Parameterwert ändern, wirkt sich dies daher nicht auf das Argument im Methodenaufruf aus. Wenn Sie jedoch den Parameter mit dem Schlüsselwort “ref” markieren, wird dies in der tatsächlichen Variablen widergespiegelt.

  • Sie müssen die Variable vor dem Aufruf der function initialisieren.
  • Es ist nicht zwingend erforderlich, dem Ref-Parameter in der Methode einen Wert zuzuweisen. Wenn Sie den Wert nicht ändern, müssen Sie ihn als “ref” markieren?

Ref-Parameter müssen nicht in der function gesetzt werden, während Out-Parameter vor dem Verlassen der function an einen Wert gebunden werden müssen. Variablen, die als out übergeben werden, können auch an eine function übergeben werden, ohne initialisiert zu werden.

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

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

out Parameter werden von der aufgerufenen Methode initialisiert, ref Parameter werden vor Aufruf der Methode initialisiert. Daher werden out Parameter verwendet, wenn Sie nur einen sekundären Rückgabewert erhalten müssen, ref Parameter werden verwendet, um einen Wert zu erhalten und geben möglicherweise eine Änderung an diesen Wert zurück (sekundär zum Hauptrückgabewert).

Das Schlüsselwort ref wird verwendet, um Werte als Referenz zu übergeben. (Dies schließt nicht aus, dass die übergebenen Werte Werttypen oder Referenztypen sind). Ausgabeparameter, die mit dem Schlüsselwort out angegeben werden, dienen zum Zurückgeben von Werten aus einer Methode.

Ein wichtiger 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

Ein out Parameter ist ein ref Parameter, dem ein spezielles Out() -Attribut hinzugefügt wurde. Wenn ein Parameter für eine C # -Methode als out deklariert out , erfordert der Compiler, dass der Parameter geschrieben wird, bevor er gelesen werden kann und bevor die Methode zurückkehren kann. Wenn C # eine Methode aufruft, deren Parameter ein Out() Attribut enthält, wird der Compiler zum Zweck der Entscheidung, ob “nicht definierte Variable” -Fehler gemeldet werden sollen, so tun, als ob die Variable unmittelbar vor dem Aufruf der Methode geschrieben würde. Beachten Sie, dass andere .NET-Sprachen dem Out() -Attribut nicht die gleiche Bedeutung zuweisen. Daher ist es möglich, dass beim Aufruf einer Routine mit einem out Parameter die betreffende Variable nicht beeinflusst wird. Wenn eine Variable als out Parameter verwendet wird, bevor sie definitiv zugewiesen wird, generiert der C # -Compiler Code, um sicherzustellen, dass er vor der Verwendung gelöscht wird. Wenn jedoch eine solche Variable den Bereich verlässt und wieder eingibt, gibt es keine Garantie dass es wieder gelöscht wird.

Ref wird wahrscheinlich auf Null ersticken, da vermutlich erwartet wird, ein existierendes Objekt zu modifizieren. out erwartet null, da es ein neues Objekt zurückgibt.

out und ref sind genau gleich, 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 :).

Um jedoch deutlicher auf ihre Verwendung einzugehen, bedeutet die Bedeutung des Modifizierers, dass, wenn Sie die Referenz dieser Variablen in Ihrem Code ändern, out und ref bewirken, dass Ihre aufrufende Variable ebenfalls die Referenz ändert. Im folgenden Code wird die Variable ceo als Verweis auf die function newGuy verwendet, sobald sie vom Aufruf von doStuff zurückgegeben wird. Wenn es nicht für ref (oder out) wäre, würde die Referenz nicht geändert werden.

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

Dieser The out und ref Parameterter in C # hat einige gute Beispiele.

Der grundlegende Unterschied besteht darin, dass out Parameter nicht initialisiert werden müssen, wenn sie übergeben werden, während ref-Parameter dies tun.

Wenn ein out-Parameter in der Methodendeklaration deklariert wird, sollte der Methodenrumpf der out-Variablen vor der Rückgabe einen Wert zuweisen. Es liegt also in der Verantwortung der aufgerufenen Methode, den Wert dem out-Parameter zuzuordnen, bevor er zurückkehrt.

Wenn ein ref-Parameter in der Methode deklariert wird, sollte das Argument, das beim Aufrufen der Methode übergeben wird, den Wert zugewiesen haben. Es liegt in der Verantwortung des Aufrufers, vor dem Aufruf der Methode den Wert für das Argument ref zuzuweisen.

Sie sind subtil anders.

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

  • Kann den Parameter nicht lesen, bevor ihm ein Wert zugewiesen wird
  • Muss vor der Rückgabe einen Wert zuweisen

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


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

  • Kann den Wert vor dem Zuweisen prüfen
  • Kann den ursprünglichen Wert unberücksichtigt lassen

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

Out hat eine neue mehr Succint Syntax in C # 7 erhalten https://docs.microsoft.com/en-us/dotnet/articles/csharp/whats-new/csharp-7#more-expression-bodied-members und noch mehr Spannend sind die C # 7-Tupel-Erweiterungen, die eine elegantere Wahl als die Verwendung von ref und out IMHO sind.