Tôi đang tìm hiểu về Các sự kiện/Đại biểu trong C#. Tôi có thể hỏi ý kiến của bạn về kiểu đặt tên/mã hóa mà tôi đã chọn (được lấy từ cuốn sách Head First C#) không?Sự kiện - quy ước đặt tên và kiểu
Đang dạy bạn bè về điều này vào ngày mai, và tôi đang cố gắng tìm ra cách giải thích các khái niệm thanh lịch nhất. (Nghĩ cách tốt nhất để hiểu một vấn đề là để thử và dạy nó!)
class Program
{
static void Main()
{
// setup the metronome and make sure the EventHandler delegate is ready
Metronome metronome = new Metronome();
// wires up the metronome_Tick method to the EventHandler delegate
Listener listener = new Listener(metronome);
metronome.OnTick();
}
}
public class Metronome
{
// a delegate
// so every time Tick is called, the runtime calls another method
// in this case Listener.metronome_Tick
public event EventHandler Tick;
public void OnTick()
{
while (true)
{
Thread.Sleep(2000);
// because using EventHandler delegate, need to include the sending object and eventargs
// although we are not using them
Tick(this, EventArgs.Empty);
}
}
}
public class Listener
{
public Listener(Metronome metronome)
{
metronome.Tick += new EventHandler(metronome_Tick);
}
private void metronome_Tick(object sender, EventArgs e)
{
Console.WriteLine("Heard it");
}
}
n.b. Mã được cấu trúc lại từ http://www.codeproject.com/KB/cs/simplesteventexample.aspx
Phương án bảo vệ là thêm "= delegate {};" để khai báo Tick (xem http://stackoverflow.com/questions/231525/raising-c-events-with-an-extension-method-is-it-bad/231536#231536) – Benjol
Lưu ý rằng lỗ hổng không phải là _limited_ để môi trường đa luồng. Có thể (nếu sociopathic) cho một trình xử lý sự kiện để loại bỏ tất cả các trình xử lý khỏi một sự kiện, dẫn đến một sự cố khi trình xử lý hoàn tất và sự kiện gọi cố gắng chạy sự kiện tiếp theo (hiện không tồn tại). –
@GregD: Có cách nào để idiotproof nó như vậy mà mã khách hàng không thể làm điều đó? –