2013-03-26 41 views
1

在處理現有框架時,有時您需要傳入操作委託,該委託不執行任何操作,通常是原始開發人員添加的擴展點。例如:.NET Framework支持的空操作語法或單例

var anObject = new Foo(() => { }); 

而且據推測Foo對象會在某個時間調用這個委託。我的目標是消除{}的使用,因爲我的風格決定需要獨立運行,並且需要獨立行,而且我有點強迫症,如果不必這樣做,我會討厭冗長。

當與返回值的動作處理,這是簡單的enough-你可以提供一個表達式,而不是一個聲明(從而消除了括號。)例:

var anObject = new Foo(() => string.Empty); 

所以,我認爲這個問題是兩部分...

.NET是否有任何形式的默認空操作? 是否有語法糖爲除lambda之外的lambda提供空表達式?

我所傾向的當前解決方案是在前面的賦值中定義委託,以避免在函數調用中使用表達lambda表達式。

回答

2

沒有什麼內置的,我知道。

你可以只定義委託一次作爲輔助單:

var anObject = new Foo(NoOpAction.Instance); 

// ... 

var anotherObject = new Bar(NoOpAction.Instance); 

// ... 

public static class NoOpAction 
{ 
    private static readonly Action _instance =() => {}; 

    public static Action Instance 
    { 
     get { return _instance; } 
    } 
} 

而且因爲你正好每次使用NoOpAction.Instance整個程序的時間交給了相同的委託,你還節省創建和垃圾收集多個代表的(確實很小的)代價都是一樣的。

+0

這是我前進的方向!不幸的是,我正在使用的代碼使用類型化的代表,但是你的代碼儘可能接近。謝謝。 (在提出這個問題之前,我輸入的委託問題並不清楚) – Sprague 2013-03-26 11:40:47

+0

@Sprague,看起來像你需要'公共靜態類NoOpAction ',和'公共靜態類NoOpAction '...只有另外14個! – 2016-04-07 11:46:41