2009-04-09 45 views
8

Tôi hiểu cách các sự kiện hoạt động trong C# (là một newbie công bằng trong trường này). Những gì tôi đang cố gắng hiểu là lý do tại sao chúng tôi sử dụng các sự kiện.Tại sao nên sử dụng Sự kiện?

Bạn có biết ứng dụng được mã hóa/kiến ​​trúc tốt sử dụng sự kiện không?

** phần còn lại của thông điệp snipped và đưa vào như một câu trả lời **

+1

đây là trang Hỏi & Đáp, không phải blog ... nếu bạn thực sự muốn nhận phản hồi tại đây, hãy giảm câu hỏi của bạn xuống ... chỉ là câu hỏi và đăng phần còn lại dưới dạng câu trả lời. – Shog9

Trả lời

7

Để cung cấp ví dụ điển hình về thế giới thông thường ....

Bạn có biểu mẫu, biểu mẫu có hộp danh sách. Có một lớp học hạnh phúc tốt cho hộp danh sách. Khi người dùng chọn một cái gì đó từ hộp danh sách, bạn muốn biết và sửa đổi những thứ khác trên biểu mẫu.

Nếu không có sự kiện:

Bạn lấy được từ hộp danh sách, trọng thứ để đảm bảo rằng cha mẹ của bạn là hình thức mà bạn mong đợi để được vào. Bạn ghi đè lên một phương thức ListSelected hoặc một cái gì đó, mà thao tác những thứ khác trên hình thức cha mẹ của bạn.

Với sự kiện: Biểu mẫu của bạn lắng nghe sự kiện để cho biết người dùng đã chọn thứ gì đó và thao túng những thứ khác trên biểu mẫu.

Sự khác biệt là trong trường hợp không có sự kiện bạn đã tạo một lớp có mục đích duy nhất và cũng là một trường được ràng buộc chặt chẽ với môi trường mà nó dự kiến ​​sẽ có trong đó. biểu mẫu được bản địa hóa thành biểu mẫu của bạn và hộp danh sách chỉ là, một hộp danh sách.

1

Bạn luôn có thể xây dựng theo cách riêng của bạn gửi/nhận các sự kiện, đăng ký/hủy đăng ký các nguồn tin sự kiện. Nhưng ngôn ngữ cung cấp cho bạn một cách đơn giản/tiêu chuẩn để thực hiện nó, vì vậy đó là một lý do tốt để sử dụng ngôn ngữ "sự kiện" thay vì kỹ thuật sự kiện của riêng bạn.

Ngoài ra, việc sử dụng ngôn ngữ "sự kiện" cho phép bạn thực hiện tất cả các loại nội dung thú vị bằng cách sử dụng sự phản chiếu vì nó được chuẩn hóa.

Về lý do tại sao lại sử dụng kỹ thuật sự kiện. Có tất cả các loại ví dụ trong cuộc sống thực, điều này khá hữu ích và đơn giản hơn để sử dụng các sự kiện. Các sự kiện gần như tương tự về tính hữu dụng của chúng so với Windows Messages.

1

Ở mức khái niệm cơ bản nhất, Sự kiện là những gì để máy tính phản ứng với những gì bạn làm, thay vì bạn được yêu cầu phản ứng với những gì máy tính làm. Khi bạn đang ngồi trước PC của bạn với một số ứng dụng đang chạy (bao gồm cả hệ điều hành) và một số đối tượng có thể nhấp có sẵn trong mỗi ngữ cảnh để bạn lựa chọn, Sự kiện là điều sẽ xảy ra khi bạn chọn một và tất cả các phần có liên quan có thể được thông báo chính xác.

Ngay cả khi di chuyển chuột xung quanh đá ra một luồng sự kiện (ví dụ để di chuyển con trỏ).

5

* này từng là trong cơ thể câu hỏi

gì sẽ rất hữu ích là một tổ chức phi tầm thường ví dụ về ứng dụng sử dụng sự kiện (đoán nó thực sự giúp thử nghiệm quá?)

Suy nghĩ cho đến thời điểm này là:

Tại sao lại sử dụng Sự kiện hoặc xuất bản/đăng ký?

Bất kỳ số lượng lớp nào cũng có thể được thông báo khi có sự kiện.

Các thuê bao lớp học không cần phải biết làm thế nào Metronome (xem mã dưới đây) hoạt động, và Metronome không cần phải biết những gì họ sẽ làm để đáp ứng với sự kiện

Các nhà xuất bản và các thuê bao được phân tách bởi đại biểu. Điều này là rất mong muốn vì nó làm cho mã linh hoạt và mạnh mẽ hơn. Các nhịp có thể thay đổi cách nó phát hiện thời gian mà không vi phạm bất kỳ các lớp học đăng ký. Các lớp học đăng ký có thể thay đổi cách chúng phản ứng với những thay đổi về thời gian mà không phá vỡ nhịp điệu. Hai lớp quay độc lập với nhau, làm cho mã dễ bảo trì hơ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); 
     ListenerB listenerB = new ListenerB(metronome); 
     metronome.Go(); 
    } 
} 

public class Metronome 
{ 
    // a delegate 
    // so every time Tick is called, the runtime calls another method 
    // in this case Listener.metronome_Tick and ListenerB.metronome_Tick 
    public event EventHandler Tick; 

    // virtual so can override default behaviour in inherited classes easily 
    protected virtual void OnTick(EventArgs e) 
    { 
     // null guard so if there are no listeners attached it wont throw an exception 
     if (Tick != null) 
      Tick(this, e); 
    } 

    public void Go() 
    { 
     while (true) 
     { 
      Thread.Sleep(2000); 
      // because using EventHandler delegate, need to include the sending object and eventargs 
      // although we are not using them 
      OnTick(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"); 
    } 
} 

public class ListenerB 
{ 
    public ListenerB(Metronome metronome) 
    { 
     metronome.Tick += new EventHandler(metronome_Tick); 
    } 

    private void metronome_Tick(object sender, EventArgs e) 
    { 
     Console.WriteLine("ListenerB: Heard it"); 
    } 
} 

Full bài viết Tôi đang viết trên trang web của tôi: http://www.programgood.net/

nb một số văn bản này là từ http://www.akadia.com/services/dotnet_delegates_and_events.html

Cheers.

Các vấn đề liên quan