2013-03-26 43 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