有没有一种方法可以指定“空” C#lambda表达式?


118

我想声明一个“空” lambda表达式,它不会执行任何操作。有没有一种方法可以执行这种操作而不需要该DoNothing()方法?

public MyViewModel()
{
    SomeMenuCommand = new RelayCommand(
            x => DoNothing(),
            x => CanSomeMenuCommandExecute());
}

private void DoNothing()
{
}

private bool CanSomeMenuCommandExecute()
{
    // this depends on my mood
}

我这样做的意图只是控制WPF命令的启用/禁用状态,但这是一个问题。也许对于我来说还为时过早,但我想必须有一种方法可以x => DoNothing()像这样以某种方式声明lambda表达式来完成同一件事:

SomeMenuCommand = new RelayCommand(
    x => (),
    x => CanSomeMenuCommandExecute());

有什么办法可以做到这一点?似乎没有必要采取无所事事的方法。

Answers:


231
Action doNothing = () => { };

是否存在预定义的空lambda?我认为每次需要时都创建一个空的lambda是一个糟糕的主意。例如,在JQuery中noop,我希望C#中会出现类似的内容。
qqqqqqq

那么,这的异步版本是否需要冗长Func<Task> doNothing = async() => await Task.CompletedTask;
Patrick Szalapski

23

这是一个老问题,但是我想我会添加一些我认为对这种情况有用的代码。我有一个Actions静态类和一个Functions带有一些基本功能的静态类:

public static class Actions
{
  public static void Empty() { }
  public static void Empty<T>(T value) { }
  public static void Empty<T1, T2>(T1 value1, T2 value2) { }
  /* Put as many overloads as you want */
}

public static class Functions
{
  public static T Identity<T>(T value) { return value; }

  public static T0 Default<T0>() { return default(T0); }
  public static T0 Default<T1, T0>(T1 value1) { return default(T0); }
  /* Put as many overloads as you want */

  /* Some other potential methods */
  public static bool IsNull<T>(T entity) where T : class { return entity == null; }
  public static bool IsNonNull<T>(T entity) where T : class { return entity != null; }

  /* Put as many overloads for True and False as you want */
  public static bool True<T>(T entity) { return true; }
  public static bool False<T>(T entity) { return false; }
}

我相信这有助于提高可读性:

SomeMenuCommand = new RelayCommand(
        Actions.Empty,
        x => CanSomeMenuCommandExecute());

// Another example:
var lOrderedStrings = GetCollectionOfStrings().OrderBy(Functions.Identity);

10

这应该工作:

SomeMenuCommand = new RelayCommand(
    x => {},
    x => CanSomeMenuCommandExecute());

7

假设您只需要一个委托(而不是一个表达式树),那么这应该可以工作:

SomeMenuCommand = new RelayCommand(
        x => {},
        x => CanSomeMenuCommandExecute());

(这不适用于表达式树,因为它有一个语句主体。有关更多详细信息,请参见C#3.0规范的4.6节。)


2

我不完全了解您为什么需要DoNothing方法。

你不能只是做:

SomeMenuCommand = new RelayCommand(
                null,
                x => CanSomeMenuCommandExecute());

3
可能已经检查过了,并且可能会抛出NRE。
Dykam

我认为Dykam是正确的,但我只是没有考虑过传递null :-)
罗布

1
我不明白为什么这被否决了?豪尔赫(Jorge)提出了一个正确的观点,尽管要花一点精力去检查它。
科恩,

+1,这是一个有效的解决方案,只是null检查应在中扩展new RelayCommand(..
nawfal 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.