Parameter mit Schlüsselwörtern out und ref
Beim Stöbern durch fremden Code sind mir die Schlüsselwörter out und ref aufgefallen.
Aber was ist ihre Aufgabe und warum scheinen sie sich so ähnlich zu sein …
Der Zusatz ref steht für reference und soll auch einen dementsprechenden Zweck erfüllen.
public void foo(ref string bar);
Eine solche Methode erwartet eine Referenz auf einen string als Parameter und kann wie folgt bedient werden:
string txt = "Hallo"; foo (ref txt);
Zu beachten ist, dass beim Aufruf der Methode ebenfalls das Schlüsselwort ref dem Übergabeparameter vorangestellt werden muss.
Der ein oder andere wird sich nun vielleicht an folgendem Code versuchen und scheitern:
string txt; foo (ref txt);
Dies wird beim Compilieren in einer Fehlermeldung enden, denn das Schlüsselwort ref teil dem Compiler mit, dass ein Parameter bereits initialisiert ist. Und damit kommen wir auch schon zum großen Unterschied zu dem Parameterzusatz out.
Der Zusatz out ist dafür gedacht, uninitialisierte Parameter in eine Funktion zu geben, die dann eine Initialisierung vornimmt. Diese Initialisierung ist nicht etwa eine Eventualität, sondern eine Pflicht! Eine Methode, die ihre Parameter mit out deklariert, verpflichtet sich dazu, eine Initialisierung vorzunehmen.
Folgende Methode deklariert zwei mit out gekennzeichnete Parameter vom Typ string.
public void meineMethode(out string foo, out string bar);
Diese Methode könnten wir nun wie folgt nutzen:
string txt_1, txt_2; meineMethode (out txt_1, out txt_2);
Der Inhalt der Methode könnte sich vielleicht so verhalten:
public void meineMethode(out string foo, out string bar)
{
foo = "Hallo";
bar = "Welt";
}
Somit sind die Variablen txt_1 und txt_2 nach dem Aufruf der Methode initialisiert.
string txt_1, txt_2;
meineMethode (out txt_1, out txt_2);
Console.WriteLine ("## {0} {1}!", txt_1, txt_2);
Ausgabe: ## Hallo Welt!
Abschließend lässt sich also festhalten:
Mit dem Schlüsselwort ref gekennzeichnete Parameter sind 2-Wege fähig (Wert rein, Wert raus) und sichern der nutzenden Methode zu, dass sie vor Benutzung bereits initialisiert sind.
Mit dem Schlüsselwort out gekennzeichnete Parameter sind Einbahnstraßen (Leer rein, mit Wert raus) und sichern dem Aufrufenden eine Initialisierung innerhalb der Methode zu.
Literatur:
ref – http://msdn.microsoft.com/en-us/library/14akc2c7(VS.80).aspx
out – http://msdn.microsoft.com/en-us/library/t3c3bfhx(VS.80).aspx