Ein non-ref, non-out-Parameter bezeichnet wie eine lokale Variable einen Speicherort. Wenn der Typ des Speicherortes ein Referenztyp ist, enthält der Speicherort einen Verweis auf eine Instanz dieses Typs.
Ref und Out-Parameter hingegen halten einen Verweis auf einen Speicherort. Dieser Speicherort kann eine lokale Variable, ein Feld oder ein Array-Element sein. Mit anderen Worten, Ref- und Out-Parameter führen zu einer anderen Indirektionsebene. Wenn Sie in einer Methode einen ref- oder out-Parameter vom Typ reference haben, handelt es sich um eine Referenz auf einen Verweis auf ein Objekt.
Warum möchten Sie einen Verweis auf einen Verweis auf ein Objekt? Falls Sie den Verweis auf das Objekt ändern müssen (im Gegensatz zum Ändern des Objekts selbst).
Dies ist eine nützliche Technik in einigen engen Umständen.Zum Beispiel können Sie eine Funktion schreiben, die zwei Warteschlangen je nachdem, welche bestellt hat den kleineren Wert auf:
void OrderQueues(ref Queue<int> a, ref Queue<int> b)
{
if (a.Peek <= b.Peek) return;
var temp = a;
a = b;
b = temp;
}
Out Parameter sind nützlich, wenn Sie mehr als einen Wert von einer Methode zurückgeben möchten:
Meiner Erfahrung nach sind Ref- und Out-Parameter ziemlich selten und bei Referenztypen sogar noch seltener.
Beachten Sie, dass ein Ref-Parameter vom Aufrufer initialisiert werden muss, während ein Out-Parameter vom Aufrufer initialisiert werden muss. Wenn Sie dem ref-Parameter niemals einen Wert zuweisen, sollte es wahrscheinlich ein "normaler" Parameter sein. Wenn Sie einem out-Parameter niemals einen Wert zuweisen, wie in Ihrem Beispiel, wird Ihr Code nicht kompiliert.