412 Stimmen

Unterschied zwischen ref- und out-Parametern in .NET

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

511voto

Khoth Punkte 12918

Der einzige Unterschied besteht darin, dass eine Variable, die Sie als out Parameter muss nicht initialisiert werden, aber er wird als ref muss er auf irgendetwas eingestellt werden.

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

134voto

Derek Park Punkte 44820

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

Der Aufrufer einer Methode, die einen Out-Parameter annimmt, muss die als Out-Parameter übergebene Variable vor dem Aufruf nicht zuweisen; der Aufrufende muss jedoch den Out-Parameter vor der Rückkehr zuweisen.

Im Gegensatz dazu gelten Ref-Parameter als ursprünglich vom Aufrufer zugewiesen. Daher ist der Aufrufer nicht verpflichtet, den ref-Parameter vor der Verwendung zuzuweisen. Ref-Parameter werden sowohl in eine als auch aus einer Methode heraus übergeben.

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

Diese entsprechen weitgehend den [out] y [in,out] Parameter der COM-Schnittstellen, die Vorteile der out Dies vermeidet sowohl die Kosten für die Zuweisung als auch alle Kosten, die mit dem Marshaling verbunden sein könnten (was bei COM wahrscheinlicher ist, aber in .NET nicht ungewöhnlich ist).

86voto

Euro Micelli Punkte 32040

ref y out erlauben beide der aufgerufenen Methode, einen Parameter zu ändern. Der Unterschied zwischen ihnen besteht darin, was passiert antes de treffen Sie den Anruf.

  • ref bedeutet, dass der Parameter mit einem Wert belegt ist antes de in die Funktion einfließen. Die aufgerufene Funktion kann den Wert jederzeit lesen oder ändern. Der Parameter geht rein und kommt wieder raus

  • out bedeutet, dass der Parameter keinen offiziellen Wert hat, bevor er in die Funktion eingeht. Die aufgerufene Funktion muss ihn initialisieren. Der Parameter erlischt nur

Das ist meine Lieblingsbetrachtungsweise: ref ist die Übergabe von Variablen per Referenz. out ist die Erklärung eines sekundären Rückgabewert für die Funktion. Es ist, als ob Sie dies schreiben könnten:

// 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 finden Sie eine detailliertere Liste der Auswirkungen der einzelnen Alternativen:

Vor dem Aufruf der Methode:

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

out : Die aufrufende Methode muss den Wert des Arguments vor dem Aufruf der Methode nicht setzen. Höchstwahrscheinlich sollten Sie das auch nicht. Vielmehr wird jeder aktuelle Wert verworfen.

Während des Gesprächs:

ref : Die aufgerufene Methode kann das Argument zu jeder Zeit lesen.

out : Die aufgerufene Methode muss den Parameter initialisieren, bevor sie ihn liest.

Entfernte Anrufe:

ref : Der aktuelle Wert wird an den Fernaufruf übergeben. Zusätzliche Kosten für die Leistung.

out : Es wird nichts an den Remote-Aufruf übergeben. Schneller.

Technisch gesehen, könnten Sie immer ref anstelle von out aber out ermöglicht es Ihnen, die Bedeutung des Arguments präziser zu formulieren, und manchmal kann es sehr viel effizienter sein.

19voto

Beispiel für OUT: Die Variable wird nach dem Eintritt 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;

        }

    }
}

Sortie :

10

\===============================================

Beispiel für Ref: Die Variable sollte initialisiert werden, bevor sie in die Methode geht. Später wird derselbe Wert oder ein geänderter 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;

        }

    }
}

Sortie :

    0
    10

\=================================

Ich hoffe, es ist jetzt klar.

10voto

Brian R. Bondy Punkte 325712
  • A ref muss initialisiert werden, bevor sie übergeben wird.
  • Eine out muss in Ihrer Funktionsimplementierung gesetzt werden
  • out Parameter können als zusätzliche Rückgabevariablen (nicht als Eingabe) betrachtet werden.
  • ref Parameter können sowohl als Eingangs- als auch als Ausgangsvariablen betrachtet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X