Quan trọng: hãy cẩn thận khi đăng ký sự kiện tĩnh từ các phiên bản. Tĩnh-tĩnh là tốt, nhưng một thuê bao từ một sự kiện tĩnh đến một trình xử lý thể hiện là một cách tuyệt vời (đọc: rất nguy hiểm) để giữ cho cá thể đó tồn tại mãi mãi. GC sẽ thấy liên kết, và sẽ không thu thập cá thể trừ khi bạn hủy đăng ký (hoặc sử dụng một cái gì đó như một WeakReference).
Các mô hình để tạo sự kiện tĩnh cũng giống như sự kiện isntance, chỉ với static
:
public static event EventHandler SomeEvent;
Để làm cho cuộc sống dễ dàng hơn (tái kiểm tra null), một thủ thuật hữu ích ở đây là thêm một handler tầm thường:
public static event EventHandler SomeEvent = delegate {};
Sau đó, bạn chỉ có thể gọi nó mà không null-kiểm tra:
SomeEvent(null, EventArgs.Empty);
Lưu ý rằng vì các cá thể đại diện là không thay đổi, và tham chiếu là an toàn luồng, không bao giờ có điều kiện chủng tộc ở đây và không cần khóa ... ai đã đăng ký khi chúng tôi không tham chiếu.
(điều chỉnh cho sự kiện của riêng bạn-args, v.v.). Thủ thuật này áp dụng như nhau đối với các sự kiện cụ thể.
Nguồn
2008-11-14 06:23:38
Khi đọc câu trả lời của bạn, bạn đã nói, "đăng ký từ một sự kiện tĩnh tới trình xử lý thể hiện là cách tuyệt vời để giữ cho cá thể đó tồn tại mãi mãi", tôi cho rằng điều này sẽ không phải lúc nào cũng tối ưu. Nếu, nói, tôi đang sử dụng một lớp tĩnh để lưu trữ các thiết lập Form trong khi nó đang chạy, điều này sẽ không phải là một điều xấu vì nó tĩnh, và không thể có nhiều bản sao? (Lập trình viên mới, tha thứ cho thuật ngữ xấu) – Josh
@Josh "cách tuyệt vời" có nghĩa là "một cách thực sự nguy hiểm" - tôi đã làm rõ điều đó. Nếu bạn chỉ có một đăng ký, nó không phải là một vấn đề lớn bất kể trường hợp so với tĩnh. Phần nguy hiểm xuất hiện khi mọi cá thể đăng ký (nói) với sự kiện tĩnh hoặc sự kiện trên đối tượng tồn tại lâu dài và không bao giờ hủy đăng ký. Hey mau: guốc bộ nhớ. –
"đăng ký từ một sự kiện tĩnh tới trình xử lý đối tượng" có được viết như vậy theo mục đích không? Tôi tin rằng nó nên được "đăng ký từ một xử lý dụ một sự kiện tĩnh" thay thế. –