2016-11-12 5 views
4
//method with an optional parameter 
public void DoSomething(int a, int b = 42); 

//caller 
DoSomething(a, b: default); 

Kann dies in C# erfolgen?Übergeben des Standardparameterwerts (was auch immer es ist)

Sie könnten sagen, "wenn Sie den Parameter nicht festlegen möchten, rufen Sie einfach die Methode ohne es". Aber dann bekomme ich hässlich IFs wie dies in meinem Code:

//kinda ugly :(
if(parameterIsSet) 
    DoSomething(a, myValue); 
else 
    DoSomething(a); 

Wenn ich diese stattdessen tun könnte:

DoSomething(a, b: parameterIsSet ? myValue : default); 

ich natürlich kann dies tun:

DoSomething(a, b: parameterIsSet ? myValue : 42); 

Aber ich will nicht "42" an zwei Stellen fest codieren

+1

Haben Sie Zugriff auf die DoSomething-Definition und haben Sie das Recht, sie zu ändern? – CodeNotFound

+1

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

+0

@rbm vielleicht hat er keinen Zugriff auf DoSomething-Code. – CodeNotFound

Antwort

4

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.

+0

Ja, ich denke, die 'Null' ist der Weg zu gehen, wie in Ihrem ersten Code-Snippet. Vielen Dank – jazzcat

Verwandte Themen