Hầu hết các mã tôi đã thấy sử dụng cách sau để khai báo và gọi sự kiện bắn:Đây có phải là cách tốt hơn để kích hoạt/gọi các sự kiện mà không cần kiểm tra null trong C# không?
public class MyExample
{
public event Action MyEvent; // could be an event EventHandler<EventArgs>, too
private void OnMyEvent()
{
var handler = this.MyEvent; // copy before access (to aviod race cond.)
if (handler != null)
{
handler();
}
}
public void DoSomeThingsAndFireEvent()
{
// ... doing some things here
OnMyEvent();
}
}
Thậm chí ReSharper tạo ra một phương pháp cách gọi đường nêu trên.
Tại sao không chỉ làm điều đó theo cách này:
public class MyExample
{
public event Action MyEvent = delegate {}; // init here, so it's never null
public void DoSomeThingsAndFireEvent()
{
// ... doing some things here
OnMyEvent(); // save to call directly because this can't be null
}
}
bất cứ ai có thể giải thích lý do tại sao không làm điều này? (ủng hộ so với nhược điểm)
Tôi nghe Jon Skeet thực hiện theo cả hai cách ... –
Tôi nghĩ rằng trong hầu hết các trường hợp nó không quan trọng để có được nhận thấy nếu có ít nhất một "thực sự" nghe đính kèm ... như đã thấy ở trên đã có một kiểm tra null nếu được sử dụng theo cách "bình thường". – Beachwalker
có thể trùng lặp của [Có một nhược điểm nào khi thêm một đại biểu trống ẩn danh vào khai báo sự kiện không?] (Http://stackoverflow.com/questions/170907/is-there-a-downside-to-adding-an-anonymous-empty -delate-on-event-declaration) – CodesInChaos