(Đây là tất cả từ góc độ C#.)
Tôi có một article about the differences between events and delegates. Điều đó bao gồm mọi thứ được đề cập bên dưới chi tiết hơn rất nhiều.
Về cơ bản tôi muốn nghĩ về một sự kiện giống như một tài sản - đó là một cặp phương pháp, đó là tất cả. Thay vì nhận/đặt, sự kiện có thêm/xóa - nghĩa là "thêm trình xử lý sự kiện này" và "xóa trình xử lý sự kiện này". Ở cốt lõi, đó là tất cả sự kiện.
C# cũng có trường như các sự kiện đó là một phím tắt:
public event EventHandler Foo;
tuyên bố cả một lĩnh vực và một sự kiện, với một add gần tầm thường/xóa thực hiện. Trong lớp học, tham chiếu đến Foo
là trường. Bên ngoài lớp học, tham chiếu đến Foo
đề cập đến sự kiện.
Ý tưởng cơ bản là một sự kiện cho phép mã khác đăng ký và hủy đăng ký, bằng cách chuyển qua một đại biểu (sự kiện xử lý). Thông thường, đăng ký được thực hiện bằng cách tạo một đại biểu đa phương tiện mới có chứa danh sách xử lý sự kiện trước đây và trình xử lý sự kiện mới.Vì vậy, nếu bạn đang lưu trữ xử lý sự kiện trong một lĩnh vực được gọi là myEventHandlers
, việc thực hiện thuê bao có thể là:
myEventHandlers += value;
Tương tự việc hủy đăng ký thường liên quan đến việc tạo ra một đại biểu multicast mới mà không xử lý theo quy định:
myEventHandlers -= value;
Sau đó, khi bạn muốn tăng/kích hoạt sự kiện, bạn chỉ cần gọi đại biểu multicast đó - thường là với kiểm tra vô hiệu để tránh trường hợp ngoại lệ bị ném nếu không có ai đăng ký:
EventHandler handler = myEventHandlers;
if (handler != null)
{
// You could pass in a different "sender" and "args" of course
handler(this, EventArgs.Empty);
}
Sử dụng sự kiện, người đăng ký không biết về nhau và không thể tự nâng cao sự kiện (thường là). Nói cách khác, đó là một mô hình đóng gói, đã được đưa ra trạng thái trong cả ngôn ngữ và nền tảng.
Không, sự kiện * không phải * đại biểu. Sự kiện là thêm/loại bỏ các phương pháp, về cơ bản. Nói rằng các sự kiện là đại biểu giống như nói rằng các thuộc tính là các trường. –
Các thuộc tính IMHO SHALL hoạt động giống như các trường, giống như các sự kiện sẽ hoạt động như các đại biểu multicast. Khác là nó gây hiểu nhầm cho người dùng của một lớp vì quyền truy cập thuộc tính & trường trông giống như trong nguồn như gửi công việc sự kiện và công văn ủy nhiệm. Điều này không có nghĩa là tài sản hoặc sự kiện cần sử dụng triển khai mặc định (trường sao lưu, ủng hộ ủy quyền đa phương tiện). Nó chỉ có nghĩa là "thuộc tính/trường: Nhận/Đặt một giá trị không có tác dụng phụ" và "sự kiện/đại biểu: chạy một cuộc gọi lại". Với các thuộc tính/sự kiện, ngôn ngữ cung cấp cho bạn rất nhiều sợi dây mà bạn có thể sử dụng một cách hợp lý hoặc treo cổ. – froh42