In einem Fall wie diesem, ich w Normalerweise sollte null
wie in einem Kommentar erwähnt verwendet werden. So würde der Code wie folgt aussehen:
public void DoSomething(int a, int? bOverwrite = null)
{
int b = bOverwrite ?? 42;
// remaining code as before...
}
In einem solchen Fall würden Sie in der Regel parameterIsSet
Variable entfernen und eine Variable mit null initialisieren und einen Wert bei Bedarf einstellen:
int? myB = null;
if (/* some condition */)
{
myB = 29;
}
DoSomething(a, myB);
Wenn Sie noch parameterIsSet
haben könnten Sie die Funktion wie folgt aufrufen:
DoSomething(a, parameterIsSet ? b : default(int?));
Andere Alternativen:
Wenn Sie viele solche Parameter haben, könnte es einfacher sein, eine Klasse für Parameter zu erstellen und den Standard in Konstruktor gesetzt:
class DoSomethingParameters
{
public DoSomethingParameters() { A = 12; B = 42; }
public int A { get; set; }
public int B { get; set; }
}
var parameters = new DoSomethingParameters();
parameters.A = /* something */;
if (/* some condition */ {
parameters.B = 29;
}
DoSomething(parameters);
Und wenn einige Fällen die hässlichen IFs könnten die beste Lösung, so viele sein Manchmal können Sie die gleiche Bedingung verwenden, um b
auf jeden Fall zu initialisieren, oder Sie benötigen mehr Variablen, um alles im Auge zu behalten, und der endgültige Code könnte sogar hässlicher sein als der hässliche Code.
if (/* some condition */)
{
int b = some_complet_expression;
DoSomething(a, b);
// Some other stuff here....
}
else
{
DoSomething(a);
// Different stuff here...
}
Insbesondere wenn Sie einen anderen Code haben würde, die nach dem Aufruf der Bedingung abhängig, könnte es die Basislösung sein. Jeder Fall ist spezifisch. Mit Erfahrung lernen Sie, wie Sie den besten Code für die Situation schreiben.
Haben Sie Zugriff auf die DoSomething-Definition und haben Sie das Recht, sie zu ändern? – CodeNotFound
Ihre Logik scheint 'ParameterIsSet' und' MyValue' zu verknüpfen. Warum nicht mit dieser Logik in "DoSomething" umgehen? "DoSomething (a, myValue)", auch wenn "myValue" ist "null" – rbm
@rbm vielleicht hat er keinen Zugriff auf DoSomething-Code. – CodeNotFound