「空の」C#ラムダ式を指定する方法はありますか?


118

何もしない "空の"ラムダ式を宣言したいのですが。DoNothing()メソッドを必要とせずにこのようなことをする方法はありますか?

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

private void DoNothing()
{
}

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

これを行う私の意図は、WPFコマンドの有効/無効状態を制御することだけですが、それはさておきです。多分それは私にとって早すぎる時期ではあるかもしれませんがx => DoNothing()、同じことを達成するためにこのような方法でラムダ式を宣言するだけの方法があるはずだと思います:

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

これを行う方法はありますか?何もしないメソッドを必要とする必要はないようです。

回答:


231
Action doNothing = () => { };

定義済みの空のラムダはありますか?必要になるたびに空のラムダを作成するのは、賢明なパフォーマンスだと思います。たとえば、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 2009年

Dykamは正しいと思いますが、nullを渡すことについては考えていませんでした:-)
Rob

1
これが反対投票された理由がわかりませんか?ホルヘは妥当な主張をしますが、それをチェックするのは少しの努力でした。
コーエン

+1、これは有効な解決策ですが、nullチェックをで拡張する必要がありますnew RelayCommand(..
nawfal 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.