【问题标题】:.NET Framework supported empty action syntax or singleton.NET Framework 支持空操作语法或单例
【发布时间】:2013-03-26 10:35:23
【问题描述】:

在使用现有框架时,有时您需要传入一个不执行任何操作的操作委托,通常是原始开发人员添加的扩展点。示例:

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

而且大概 Foo 对象会在某个时候调用这个委托。我的目标是消除 { } 的使用,因为我的风格规定 { } 需要单独使用,并且需要单独的行,而且我有点强迫症并且讨厌如果我不必那么冗长。

在处理返回值的操作时,这很简单——您可以提供表达式而不是语句(从而消除大括号。)示例:

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

所以,我想问题是两个部分......

.NET 是否有任何类型的默认空操作? 除了 { } 之外,是否有用于向 lambda 提供空表达式的语法糖?

我目前倾向于的解决方案是在前面的赋值中定义委托,以避免在函数调用中使用 lambda 表达式。

【问题讨论】:

标签: c# .net lambda delegates syntactic-sugar


【解决方案1】:

没有任何我知道的内置内容。

您可以将委托一次定义为辅助单例:

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 时都会收到完全相同的委托,因此您还可以节省创建和垃圾收集都执行相同操作的多个委托的(诚然很小的)成本.

【讨论】:

  • 这是我前进的方向!不幸的是,我正在使用的代码使用类型化的委托,但您的代码几乎与它一样接近。谢谢。 (直到问了这个问题之后,我才明白键入的委托问题)
  • @Sprague,看来你需要public static class NoOpAction<T1>public static class NoOpAction<T1, T2>...只剩下14 个了!
猜你喜欢
  • 2018-01-04
  • 2011-12-25
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2018-06-04
  • 2020-06-21
  • 1970-01-01
相关资源
最近更新 更多