Есть ли способ указать «пустое» лямбда-выражение 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;?
Патрик Салапски,

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());

(Это не будет работать с деревьями выражений, поскольку у них есть тело оператора . Подробнее см. В разделе 4.6 спецификации C # 3.0.)


2

Я не совсем понимаю, зачем вам метод DoNothing.

Разве ты не можешь просто сделать:

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

3
Это, вероятно, проверено и, вероятно, вызовет NRE.
Dykam

Я думаю, что Дикам прав, но я просто не думал о том, чтобы передать ноль :-)
Роб

1
Я не понимаю, почему это отклонено? Хорхе высказывает веское мнение, хотя проверить его было бы небольшими усилиями.
Коэн

+1, это правильное решение, просто нужно расширить нулевую проверку new RelayCommand(...
nawfal
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.