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?
Antworten
Zu viele Anzeigen?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.
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).
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.
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.
- 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.
- See previous answers
- Weitere Antworten anzeigen