Ich schreibe eine Methode (nennen wir es 'Bar'), die viele Parameter akzeptiert. Aus Gründen der Bequemlichkeit habe ich einen Standardwert festgelegt, so dass Entwickler beim Aufruf meiner Methode keinen Haufen von 'null' angeben müssen. Mit anderen Worten, sieht meine Methode Unterschrift wie folgt aus:Wie unterscheidet man zwischen ausgelassenen Parameter und Parameter Standardwert
public void Bar(string paramA = null, string paramB = null, ... many more parameters omitted...)
Der Code in meiner Methode überprüft, für einen Nullwert und ignoriert den Parameter in diesem Fall. Es gibt jedoch einige Situationen, in denen ich zwischen einem Standard-Nullwert und einem vom Entwickler absichtlich gesetzten Nullwert unterscheiden muss.
Hier sind zwei Beispielanrufe zu illustrieren, worüber ich spreche. Die erste enthält alle Parameter (und daher wird der C# -Compiler sie zur Kompilierungszeit durch null ersetzen), und im zweiten Beispiel hat der Entwickler entschieden, für den ersten Parameter 'null' anzugeben.
Bar();
Bar(null);
Ich habe mehrere Artikel gefunden, die über die Verwendung von „Option/Einige/Keine“ Muster sprechen. Das beste ist meiner Meinung nach here.
Aber ich kämpfe, um herauszufinden, wie ich immer noch einen "Standard" -Wert für die Bequemlichkeit der Entwickler bereitstellen kann. Konzeptionell, ich möchte so etwas schreiben:
public void Bar(Option<string> paramA = Option.None)
aber der C# Compiler beschwert sich, dass ‚Option.None‘ ist keine Kompilierung-Konstante.
Wenn Sie haben, „viele Parameter“, gibt es sehr oft eine Parameterklasse aussteigen zu kämpfen, dass Sie mit Eigenschaften nach Belieben initialisieren können (und die Sie auf die Standardwerte nicht zuweisen links). Dies erfordert auch keine funky 'Option' Klassen. Und es wird nicht brechen, wenn Sie die Standardeinstellungen in der nächsten Version ändern müssen. –
Oder Sie können einen zusätzlichen Parameter 'bool useA = true' hinzufügen und wenn der Benutzer nicht A verwenden möchte, kann er' useA' auf 'false' setzen. In der Praxis ist es jedoch besser, eine Überladung hinzuzufügen oder eine Klasse als Parameter zu verwenden, wie es von anderen vorgeschlagen wurde. – Phil1970