.NET Tipps 5: Optionale Parameter und Params sind keine gute Idee

Mal wieder ein neuer .NET Tipp!

C# hat ja so nette Funktionen wie optionale Parameter und „params„. Beide für sich sehr praktisch, mit dem ersten kann man Parametern Default-Werte mitgeben, die benutzt werden, wenn der Parameter nicht angegeben wird. Mit dem zweiten kann man einen Parameter kennzeichnen, der ein Array erwartet, statt diesem kann man dann auch einfach eine Kommata-getrennte Liste angeben.

Nur beides zusammen ist keine gute Idee: Ich hatte diese Funktion, welche eine optionale Sequenznummer erwartet, sowie eine Liste von NiboCommand-Objekten:


public static string GetCommandString(int sequenceNumber = -1, params NiboCommand[] commands)
{ }

Nur wie ruft man die jetzt auf? Ganz ohne Parameter geht es, aber das ist ja meistens nicht gewünscht… Nur so etwas geht leider nicht:


GetCommandString(new NiboGetCommand(1))

Jetzt wird der erste Parameter als Sequenznummer interpretiert, und NiboGetCommand kann nicht in int konvertiert werden 🙁

Die einzige Lösung so eine Funktion aufzurufen ist diese:


CommandBuilder.GetCommandString(commands: new[]{ new NiboGetCommand(2), new NiboGetCommand(5)})

Man muss den Namen des Parameters („commands“) explizit angeben (das ist auch ein nettes Features von C#, BTW), und muss dann aber ein Array übergeben (welche hier automatisch typisiert wird, noch ein nettes Feature ;))

Die Reihenfolge der Parameter zu ändern ist übrigens auch keine Lösung, params muss immer der letzte sein. Meine Lösung? Die Sequenznummer weglassen, die braucht eh kein Mensch…

2 Gedanken zu „.NET Tipps 5: Optionale Parameter und Params sind keine gute Idee

  1. Wieso überlädst du die Funktion nicht einfach?

    string GetCommandString(int sequenceNumber, params ....) { ... }

    string GetCommandString(params ....) {
    GetCommandsString(-1, commands);
    }

    Oder geht das nicht bei den Params? (Nie wirklich benutzt/gebraucht…)

    1. Hmm… Das wäre ein Idee 😉 Ich dachte immer, dass optionale Parameter intern das gleiche sind wie eine überladene Funktion, aber das könnte funktionieren. Muss ich mal testen 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert