มีวิธีระบุนิพจน์ C # lambda ที่ "ว่าง" หรือไม่?


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

ดังนั้นเวอร์ชัน async จึงต้องการ verbose 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);


7

สมมติว่าคุณต้องการเพียงผู้รับมอบสิทธิ์ (แทนที่จะเป็นโครงสร้างนิพจน์) สิ่งนี้ควรได้ผล:

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

(ซึ่งจะใช้ไม่ได้กับต้นไม้นิพจน์เนื่องจากมีเนื้อหาคำสั่งดูส่วน 4.6 ของข้อกำหนด C # 3.0 สำหรับรายละเอียดเพิ่มเติม)


2

ฉันไม่เข้าใจอย่างถ่องแท้ว่าทำไมคุณต้องใช้วิธี DoNothing

คุณไม่สามารถทำได้:

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

3
นั่นอาจถูกตรวจสอบและอาจจะโยน NRE
Dykam

ฉันคิดว่า Dykam ถูกต้อง แต่ฉันไม่ได้คิดเกี่ยวกับการผ่าน null :-)
Rob

1
ฉันไม่เข้าใจว่าทำไมจึงถูกลดคะแนน? Jorge ระบุจุดที่ถูกต้องแม้ว่าจะต้องใช้ความพยายามเล็กน้อยในการตรวจสอบก็ตาม
Cohen

+1 นี่เป็นวิธีแก้ปัญหาที่ถูกต้องเพียงแค่ขยายการตรวจสอบ null ในnew RelayCommand(...
nawfal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.