2014-07-27 8 views
8

In C# können wir Standardwert des Parameters als solche bietenWie wird der Standardwert für einen Parameter des Delegattyps in C# bereitgestellt?</p> <pre><code>void Foo(int i =0) {} </code></pre> <p>Aber, wenn die Signatur der Methode ist:

void FooWithDelegateParam(Func<string,string> predicate) 
{} 

Wie wir die Standard-Parameter übergeben werden können:

void FooWithDelegateParam(Func<string,string> predicate = (string,string x)=> {return y;}) 
{} 

Aber das wird nicht kompilieren. Also, was ist die richtige Syntax dafür?

Hinweis: Ich versuche, eine Eingabe-Zeichenfolge an output-string Mapper über einen Delegaten anzugeben, und wenn nicht angegeben, möchte ich einfach die Eingabezeichenfolge zurückgeben. Daher werden Vorschläge zu alternativen Ansätzen sehr geschätzt. Vielen Dank.

Antwort

12

Sie können nicht, grundsätzlich. Standardwerte für Parameter müssen Kompilierzeitkonstanten sein. Wenn Sie jedoch sind glücklich null als Wert zu verwenden, was bedeutet, „die Standardeinstellung verwenden“ könnten Sie haben:

void FooWithDelegateParam(Func<string, string> predicate = null) 
{ 
    predicate = predicate ?? (x => x); 
    // Code using predicate 
} 

oder eine Überlastung verwenden, wie pro Alireza Vorschlag, natürlich.

Vor- und Nachteile:

  • Die Überlast Lösung arbeitet mit Sprachen, die keine optionalen Parameter unterstützen (zum Beispiel C# vor 4,0) unterscheidet
  • Die Überlast Lösung zwischen null und dem „default“. Das ist an sich hat Vor- und Nachteile:
    • Wenn der Anrufer nie einen null Wert bieten sollte, kann die Überlastung Version Bugs finden, wo es versehentlich tun ist so
    • Wenn Sie nicht glauben, wird es solche Bugs , die optionale Parameterversion ermöglicht die Vorstellung von "dem Standard" im Code dargestellt - Sie könnten einen "null Bedeutung Standard" -Wert über mehrere Ebenen übergeben, lassen Sie nur die unterste Ebene bestimmen, was diese Vorgabe tatsächlich bedeutet, und tun Sie dies einfacher als explizit verschiedene Überladungen aufrufen zu müssen
  • Die optionale Parameterversion ist einfacher in einer Schnittstelle auszugeben ...
    • ... mit dem Nachteil, dass der Standardwert in der Implementierung noch ausgedrückt werden muss. (Dies ist etwas gemeinsam mit der Überlastung Lösung, wohlgemerkt ... in beiden Fällen eine abstrakte Klasse die Schnittstelle implementieren könnte die säumige tun, um die Template-Methode Muster.)
+0

Jon Ich bin neugierig die Vor- und Nachteile eines jeden. Mit freundlichen Grüßen ist natürlich eine All-in-One-Methode, einfacher zu pflegen und meine Methode hat keine Laufzeitüberlastung. Noch etwas? – Alireza

+0

@Alireza: Wird die Antwort mit weiteren Details bearbeiten. –

+0

Vielen Dank für Ihre Zeit – Alireza

2

Sie können den Standardwert nicht angeben. Schreiben Sie stattdessen eine Überladung:

void FooWithDelegateParam() 
{ 
    FooWithDelegateParam(s => s); 
} 

void FooWithDelegateParam(Func<string,string> predicate) 
{ 

}