out
-Parameter gibt es in C# schon ewig, die Handhabe war bisher jedoch immer etwas klobig. Mit C# 7 wurden einige Änderungen vorgenommen, die eine einfachere Verwendung ermöglichen.
Wenn du nicht so firm mit out
-Parametern bist, dann möchte ich dir eine kurze Zusammenfassung im Vorfeld geben:
out
Paramter veranlassen ein Argument als Referenz übergeben zu werdenout
Parameter sowohl in der Methodensignatur als auch bei der Übergabe mit demout
Schlüsselwort gekennzeichnet werden- Eine Instanzierung vor der Verwendung ist nicht notwendig, der Variable muss jedoch innerhalb der Methode mit einem Wert versehen werden
Wann werden out
Parameter verwendet?
- Typischerweise werden sie für das Try-Pattern verwendet, siehe z.B.
Int32.TryParse
. Dadurch kann man sich darauf verlassen, dass im Falle eines Durchlaufs ein Wert gesetzt wird. Bei anderen Implementierung sollte der Wert dennoch geprüft werden, da auch eine Initialisierung aufnull
zulässig ist. - Beispielsweise wird
out
auch gerne verwendet, wenn zu einem Rückgabewert zusätzlich noch ein Status o.Ä. zurückgeliefert wird.
Zu erwähnen ist, dass aber selbst Microsoft die Verrwendung von out
-Parametern nicht empfiehlt: Avoid out parameters.
Nun aber zu den Neuerungen:
// out parameter
// old
int parsedVal;
if (Int32.TryParse("32", out parsedVal))
{
// logic
}
// new
if (Int32.TryParse("42", out int intVal))
{
// logic
}
Console.WriteLine($"{intVal}");
Wie im Code ersichtlich, kann die out-Variable nun an der Stelle deklariert werden, an der sie auch tatsächlich zum Einsatz kommt. Der Gültigkeitsbereich hat sich dadurch nicht verändert.
Auch var
kann verwendet werden, da der Typ an dieser Stelle vom Compiler festgestellt werden kann:
if (Int32.TryParse("42", out var intVal))
{
// logic
}
Console.WriteLine($"{intVal}");
Durch Verwendung von _
können out-Werte auch verworfen werden:
var size = new Size(10, 10);
size.GetHeightAndWidth(out int width, out _);
In diesem Fall wird width
übernommen, der zweite Parameter jedoch nicht.
Das war es auch schon. Viel Spaß beim Experimentieren und Verwenden.