2014-07-27 11 views
8

W języku C# możemy zapewnić domyślną wartość parametrów jako takie:Jak podać wartość domyślną dla parametru typu delegata w C#?

void Foo(int i =0) {} 

Ale, gdy podpis metoda jest:

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

Jak możemy przekazać parametr domyślnie:

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

Ale to się nie skompiluje. Jaka jest więc prawidłowa składnia?

Uwaga: Próbuję podać sposób wpisania ciągu wejściowego do programu odwzorowującego łańcuch wyjściowy przez delegata, a jeśli nie jest on podany, po prostu chcę zwrócić ciąg wejściowy. Sugestie dotyczące wszelkich alternatywnych sposobów osiągnięcia tego celu są również wysoko cenione. Dzięki.

Odpowiedz

12

Zasadniczo nie możesz. Wartości domyślne dla parametrów muszą być stałymi w czasie kompilacji. Jednakże, jeśli jesteś zadowolony używać null jako wartość oznaczającego „użyj domyślnego” można mieć:

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

Albo użyć przeciążenie, zgodnie z sugestią alireza jest, oczywiście.

Plusy i minusy:

  • Rozwiązanie przeciążenie współpracuje z języków, które nie obsługują opcjonalne parametry (na przykład C# przed 4,0)
  • Rozwiązanie przeciążenie rozróżnia null i „default”. To samo w sobie ma plusy i minusy:
    • Jeśli rozmówca nie powinien stanowić wartość null wersja przeciążenie może znaleźć błędy, gdzie jest to przypadkowo robi tak
    • Jeśli nie wierzysz, nie będzie żadnych takich błędów , opcjonalna wersja parametru pozwala na reprezentację w kodzie "wartości domyślnej" - możesz przekazać "domyślną" wartość "null przez wiele warstw, pozwalając, aby tylko najniższa warstwa określała, co to domyślne ustawienie oznacza. prostsze niż konieczność jawnego wywoływania różnych przeciążeń:
  • Opcjonalna wersja parametru jest łatwiejsza do wyrażenia w interfejsie ...
    • ... z tą wadą, że wartość domyślna musiałaby zostać wyrażona w implementacji. (Jest to dość powszechne rozwiązanie przeciążenia, przeszkadza Ci ... w obu przypadkach, klasa abstrakcyjna wykonawczych interfejsu może zrobić zalegających przy użyciu wzoru metody szablonu.)
+0

Jon jestem ciekaw plusy i minusy każdego z nich. Twoja jest oczywiście metodą "wszystko w jednym", łatwiejszą w utrzymaniu, a moja metoda nie ma przeciążenia środowiska wykonawczego. Coś jeszcze? – Alireza

+0

@Alireza: edytuje odpowiedź, podając więcej szczegółów. –

+0

Dziękuję za poświęcony czas – Alireza

2

Nie można podać wartości domyślnej. Zamiast tego wpisz przeciążenie:

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

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

} 
Powiązane problemy