Khi học ngôn ngữ C#, nhiều học viên không phân biệt giữa delegate và event; khi nào thì dùng delegate và khi nào dùng event? Để giúp các học viên hiểu rõ hơn, trong bài này sẽ so sánh các đặc điểm khác nhau giữa delegate và event trong ngôn ngữ C#.
Bảng sau đây liệt kê sự khác nhau giữa delegate và event:
Delegate | Event |
Một delegate được khai báo dùng từ khóa delegate | Một event (sự kiện) được khai báo dùng từ khóa event |
Delegate là con trỏ hàm tham chiếu tới một hay nhiều phương thức lúc thực hiện | Event là kỹ thuật cảnh báo dựa vào delegate |
Delegate độc lập và không phụ thuộc vào event | Một event phụ thuộc vào delegate và không thể tạo nếu thiếu delegate. Event là một wrapper (lớp bọc) quanh thể hiện của delegate nhằm ngăn người dùng delegate thiết lập lại delegate và chỉ cho phép thêm hay loại bỏ khỏi danh sách kích hoạt |
Delegate bao gồm các phương thức Combine() và Remove() để thêm các phương thức vào danh sách kích hoạt (invocation list). | Lớp EventInfo xem xét các event và gắn kết với event handler (Bộ xử lý sự kiện) gồm các phương thức AddEventHandler() và RemoveEventHandler() tương ứng thêm và loại bỏ khỏi danh sách kích hoạt |
Delegate có thể được chuyển vào phương thức dưới dạng tham số (method parameter) | Event được khởi phát nhưng không thể chuyển vào phương thức dưới dạng tham số (method parameter). |
Toán tử = được dùng gán một phương thức và toán tử += được dùng để gán nhiều phương thức cho một delegate | Toán tử = không thể dùng với event và chỉ toán tử += và -= có thể dùng với event để thêm hay loại bỏ event handler. |
Nói thêm cách đơn giản, event chỉ là một delegate. Đoạn mã chương trình sẽ làm việc khi loại từ khóa event và chỉ dùng delegate. Tuy nhiên, dùng từ khóa event sẽ ngăn subscribers (Người đăng ký) đăng ký với một sự kiện dùng toán tử = và có thể loại bỏ các handlers hiện đang được đăng ký.
Xét ví dụ sau:
public delegate void Notify();
public Notify MyDelegate;
MyDelegate = MyMethod;// Hợp lệ
MyDelegate += MyMethod;// Hợp lệ
public delegate void Notify();
public event Notify MyEvent;
MyEvent = MyEventHandler;// Lỗi
MyEvent += MyEventHandler;// Hợp lệ
Trên đây là những phân biệt cơ bản về delegate và event trong C#. Chúc các bạn thành công!
Theo thầy Nguyễn Ngọc Anh – Bộ môn CNTT FPT Mạng cá cược bóng đá Đà Nẵng