2014-07-27 62 views
8

在C#中,我們可以提供參數的默認值,例如:如何在C#中爲委託類型的參數提供默認值?

void Foo(int i =0) {} 

但是,當方法簽名是:

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

我們如何傳遞的默認參數:

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

但這不會編譯。那麼,這樣做的恰當語法是什麼?

注:我試圖提供一種方法來指定輸入字符串輸出字符串映射器通過委託,如果沒有提供,我只是想返回輸入字符串。因此,對於實現這一目標的任何替代方法的建議也非常感謝。謝謝。

回答

12

你不能,基本上。參數的缺省值必須是編譯時常量。但是,如果你樂於使用null作爲值的意思是「使用默認的」你可以有:

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

或者使用過載,按阿里的建議,當然。

優點和缺點:

  • 過載溶液與不支持的可選參數語言工作(例如C#4.0之前)
  • 過載溶液null和「默認」之間進行區分。這本身就具有的優點和缺點:
    • 如果主叫方不應該提供null值,過載版本可以發現漏洞的地方是意外這樣
    • 如果你不相信會有任何這樣的錯誤,可選參數版本允許在代碼中表示「默認」的想法 - 您可以在多個圖層中傳遞「null」的含義,即只允許最底層決定默認實際的含義,然後執行此操作更簡單而不必明確地呼叫不同的過載
  • 可選參數版本更易於在界面中表示...
    • ...缺點是缺省值仍需要在實現中表示。 (這有點共同的過載的解決方案,請注意...在這兩種情況下,實現該接口的抽象類能做到使用模板方法模式的違約。)
+0

喬恩我很好奇每個人的利弊。你的方法當然是一種全合一的方法,更容易維護,而且我的方法沒有運行時過載。還要別的嗎? – Alireza

+0

@Alireza:將編輯更多細節的答案。 –

+0

謝謝你的時間 – Alireza

2

您不能指定像那樣的默認值。寫一個超載代替:

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

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

} 
相關問題