Tôi chắc chắn rằng tôi chỉ không hiểu những điều căn bản về các sự kiện và/hoặc các đại biểu trong C#, nhưng tại sao tôi không thể làm các bài kiểm tra Boolean trong mẫu mã này:Trong C#, tại sao tôi không thể kiểm tra nếu một trình xử lý sự kiện là null ở bất kỳ đâu bên ngoài lớp mà nó được định nghĩa?
public class UseSomeEventBase {
public delegate void SomeEventHandler(object sender, EventArgs e);
public event SomeEventHandler SomeEvent;
protected void OnSomeEvent(EventArgs e) {
// CANONICAL WAY TO TEST EVENT. OF COURSE, THIS WORKS.
if (SomeEvent != null) SomeEvent(this, e);
}
}
public class UseSomeEvent : UseSomeEventBase {
public bool IsSomeEventHandlerNull() {
// "LEFT HAND SIDE" COMPILER ERROR
return SomeEvent == null;
}
}
class Program {
static void Main(string[] args) {
var useSomeEvent = new UseSomeEvent();
useSomeEvent.SomeEvent +=new UseSomeEventBase.SomeEventHandler(FuncToHandle);
// "LEFT HAND SIDE" COMPILER ERROR
if (useSomeEvent.SomeEvent == null) {
}
var useSomeEventBase = new UseSomeEventBase();
useSomeEventBase.SomeEvent += new UseSomeEventBase.SomeEventHandler(FuncToHandle);
// "LEFT HAND SIDE" COMPILER ERROR
if (useSomeEventBase.SomeEvent == null) {
}
}
static void FuncToHandle(object sender, EventArgs e) { }
}
+1 cho câu trả lời. Chỉ cần thêm vào nó, bạn có thể, tất nhiên, thực hiện các hoạt động thêm/gỡ bỏ như các phương thức tường minh với một đại biểu đa diễn viên nội bộ. Trong trường hợp đó, bạn có thể theo dõi người đăng ký và người đăng ký tự hủy - và do đó cung cấp quyền truy cập vào thông tin bổ sung (ví dụ: số người đăng ký, v.v.) - nếu bạn chọn. – LBushkin
Yup - sẽ thêm điều đó, cảm ơn. –
Có thể hữu ích khi lưu ý rằng các sự kiện * reason * được thực hiện theo cách này để bất kỳ lớp nào không thể thay đổi hành vi của lớp bằng sự kiện đơn giản bằng cách truy cập sự kiện (như một thuộc tính ủy nhiệm) và xóa nó danh sách người đăng ký. – womp