有没有办法指定一个“空”的 C# lambda 表达式?

Posted

技术标签:

【中文标题】有没有办法指定一个“空”的 C# lambda 表达式?【英文标题】:Is there a way to specify an "empty" C# lambda expression? 【发布时间】:2010-12-17 02:42:54 【问题描述】:

我想声明一个“空”的 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());

有没有办法做到这一点?似乎不需要什么都不做的方法。

【问题讨论】:

【参考方案1】:
Action doNothing = () =>  ;

【讨论】:

是否存在预定义的空 lambda?我认为每次需要时创建一个空的 lambda 是一个坏主意。例如。在 JQuery there is the noop 中,我希望 C# 中会出现类似的东西。 那么异步版本需要详细的Func<Task> doNothing = async() => await Task.CompletedTask;吗?【参考方案2】:

我想我会添加一些我发现对这种情况有用的代码。我有一个 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);

【讨论】:

我希望我能再次投票!【参考方案3】:

这应该可行:

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

我不完全明白你为什么需要一个 DoNothing 方法。

你不能这样做:

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

【讨论】:

这可能已被检查并且可能会抛出 NRE。 我认为 Dykam 是对的,但我只是没想过传递 null :-) 我不明白为什么这被否决了? Jorge 提出了一个有效的观点,尽管要检查它会很费力。 +1,这是一个有效的解决方案,只是空检查应该在new RelayCommand(..中扩展。【参考方案6】:
Action DoNothing = delegate  ;
Action DoNothing2 = () => ;

我曾经将事件初始化为无操作操作,因此它不为空,如果在没有订阅的情况下调用它,它将默认为“无操作函数”而不是空指针异常。

public event EventHandler<MyHandlerInfo> MyHandlerInfo = delegate  ;

【讨论】:

以上是关于有没有办法指定一个“空”的 C# lambda 表达式?的主要内容,如果未能解决你的问题,请参考以下文章

c# lambda如何查询指定的条数(就是全部数据的某段数据)

C# 2.0 - 有没有办法用产生的迭代器块做一个`GroupBy`?

哪位高人指点一下,C#中两个动态lambda 表达式有啥办法合并成一个? 谢谢!

C# datatable 去掉为空列的行

如何在 C# 中初始化一个空数组?

C#删除指定目录空文件夹(源码)