2009-07-08 29 views
22

Tôi có một sự kiện trên một trong các lớp học của mình mà tôi muốn đính kèm một trình xử lý. Tuy nhiên, tôi không cần xử lý để làm bất cứ điều gì, vì tôi chỉ kiểm tra hành vi của lớp với các trình xử lý được đính kèm hay không.No-op lambda

Chữ ký sự kiện như sau:

public event EventHandler<EventArgs> Foo; 

Vì vậy, tôi muốn làm một cái gì đó như:

myClass.Foo +=(); 

Tuy nhiên đây không phải là một biểu thức lambda hợp lệ. Cách gọn gàng nhất để diễn đạt điều này là gì?

+2

Thực tế thú vị: bạn cũng có thể đính kèm các đại biểu trống vào các sự kiện để bạn không cần thực hiện kiểm tra trống trước khi gọi sự kiện a la http://stackoverflow.com/a/1431993/1508243 –

Trả lời

28
myClass.Foo += (s,e) => {}; 

hoặc

myClass.Foo += delegate {}; 
9
(x,y) => {} //oops forgot the params 

OK? :)

Hoặc

delegate {} 
+0

() => {} không hoạt động. –

6

Hãy thử điều này:

myClass.Foo += delegate {}; 
1

Đính kèm sự kiện này thông qua một lambda như ví dụ:

myClass.Foo += (o, e) => { 
    //o is the sender and e is the EventArgs 
}; 
3

Hãy thử điều này:

myClass.Foo += (s,e) => {}; 
5

Thay vì đính kèm một đại biểu sau đó, cách phổ biến hơn là để làm gán nó ngay lập tức:

public event EventHandler<EventArgs> Foo = delegate {}; 

Tôi thích sử dụng cú pháp phương pháp vô danh trên một lambda biểu hiện ở đây vì nó sẽ làm việc với các chữ ký khác nhau khác nhau (phải thừa nhận là không có các tham số có thông số out hoặc giá trị trả về).

+0

Có, nhưng trong trường hợp này tôi không muốn gán một trình xử lý mặc định. –

+0

Đủ công bằng. (Cá nhân tôi đặt một trong chỉ là về tất cả các sự kiện tôi tuyên bố những ngày này :) –

+0

Trong trường hợp này lớp cần phải có một hành vi khác nhau nếu nó không có xử lý gắn liền với sự kiện này. Nếu không ai nghe nó, nó lẩm bẩm lặng lẽ với chính nó :) –