"Boş" bir C # lambda ifadesi belirtmenin bir yolu var mı?


118

Hiçbir şey yapmayan "boş" bir lambda ifadesi bildirmek istiyorum. DoNothing()Yönteme ihtiyaç duymadan böyle bir şey yapmanın bir yolu var mı ?

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

private void DoNothing()
{
}

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

Bunu yapmaktaki amacım yalnızca WPF komutumun etkin / devre dışı durumunu kontrol etmektir, ancak bu bir kenara. Belki benim için sabah çok erken, ama x => DoNothing()aynı şeyi başarmak için lambda ifadesini böyle bir şekilde ilan etmenin bir yolu olması gerektiğini düşünüyorum :

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

Bunu yapmanın bir yolu var mı? Hiçbir şey yapmama yöntemine ihtiyaç duymak gereksiz görünüyor.

Yanıtlar:


231
Action doNothing = () => { };

Önceden tanımlanmış boş bir lambda var mı? Her ihtiyacım olduğunda boş bir lambda yaratmanın performans açısından kötü bir fikir olduğunu düşünüyorum. Örneğin, JQuery'de varnoop ve C #'da benzer bir şeyin olmasını bekliyorum.
qqqqqqq

Öyleyse, bunun eşzamansız bir versiyonu ayrıntılı bilgi gerektirir Func<Task> doNothing = async() => await Task.CompletedTask;mi?
Patrick Szalapski

23

Bu eski bir soru, ancak bu tür durumlar için yararlı bulduğum bazı kodları ekleyeceğimi düşündüm. Bir var Actionsstatik sınıf ve bir Functionstanesi de bazı temel fonksiyonları ile statik sınıf:

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; }
}

Bunun, okunabilirliği birazcık artırdığına inanıyorum:

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

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

10

Bu çalışmalı:

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

7

Yalnızca bir temsilciye (bir ifade ağacından ziyade) ihtiyacınız olduğunu varsayarsak, bu işe yaramalıdır:

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

(Bir ifade gövdesi olduğu için ifade ağaçlarıyla çalışmaz . Daha fazla ayrıntı için C # 3.0 spesifikasyonunun 4.6 bölümüne bakın.)


2

Neden bir DoNothing yöntemine ihtiyacınız olduğunu tam olarak anlamıyorum.

Sadece yapamaz mısın:

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

3
Bu muhtemelen kontrol edilir ve muhtemelen bir NRE atar.
Dykam

Dykam'ın haklı olduğunu düşünüyorum ama null geçmeyi düşünmedim :-)
Rob

1
Bunun neden olumsuz oy verildiğini anlamıyorum? Jorge, bunu kontrol etmek için küçük bir çaba olsa da, geçerli bir noktaya işaret ediyor.
Cohen

+1, bu geçerli bir çözümdür, sadece boş kontrolün genişletilmesi gerekir new RelayCommand(...
nawfal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.