Có cách nào để chỉ định biểu thức C # lambda “trống” không?


118

Tôi muốn khai báo một biểu thức lambda "trống" không có gì cả. Có cách nào để làm điều gì đó như thế này mà không cần đến DoNothing()phương pháp không?

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

private void DoNothing()
{
}

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

Mục đích của tôi khi làm điều này chỉ là kiểm soát trạng thái được bật / tắt của lệnh WPF của tôi, nhưng đó là một bên. Có lẽ lúc này là quá sớm đối với tôi, nhưng tôi tưởng tượng phải có cách để khai báox => DoNothing() biểu thức lambda theo một cách nào đó như thế này để hoàn thành điều tương tự:

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

Có cách nào để làm việc này không? Nó chỉ có vẻ không cần thiết để cần một phương pháp không làm gì cả.

Câu trả lời:


231
Action doNothing = () => { };

Có tồn tại một lambda trống được xác định trước không? Tôi nghĩ rằng đó là một ý tưởng tồi khi tạo một lambda trống mỗi khi tôi cần. Ví dụ: trong JQuery noop và tôi mong đợi một cái gì đó tương tự sẽ có trong C #.
qqqqqqq Ngày

Vì vậy, một phiên bản không đồng bộ của điều này có yêu cầu chi tiết Func<Task> doNothing = async() => await Task.CompletedTask;không?
Patrick Szalapski

23

Đây là một câu hỏi cũ, nhưng tôi nghĩ rằng tôi sẽ thêm một số mã mà tôi thấy hữu ích cho loại tình huống này. Tôi có một Actionslớp tĩnh và một Functionslớp tĩnh với một số chức năng cơ bản trong chúng:

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

Tôi tin rằng điều này giúp cải thiện khả năng đọc chỉ một chút:

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

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

10

Điều này sẽ hoạt động:

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

7

Giả sử bạn chỉ cần một đại biểu (thay vì một cây biểu thức) thì điều này sẽ hoạt động:

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

(Điều đó sẽ không hoạt động với cây biểu thức vì nó có một phần nội dung câu lệnh . Xem phần 4.6 của thông số kỹ thuật C # 3.0 để biết thêm chi tiết.)


2

Tôi không hoàn toàn hiểu tại sao bạn cần một phương thức DoNothing.

Bạn không thể chỉ làm:

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

3
Điều đó có thể được kiểm tra và có thể sẽ ném NRE.
Dykam

Tôi nghĩ Dykam đúng, nhưng tôi không nghĩ đến việc vượt qua null :-)
Rob

1
Tôi không hiểu tại sao cái này bị từ chối? Jorge đưa ra một quan điểm hợp lệ, mặc dù sẽ chỉ là một nỗ lực nhỏ để kiểm tra nó.
Cohen

+1, đây là một giải pháp hợp lệ, chỉ là việc kiểm tra null nên được mở rộng new RelayCommand(...
nawfal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.