Tôi có đoạn mã sau vào lớp học của tôiBạn có thể sử dụng phép gán bằng khi loại bỏ các thành viên đại biểu trong một phương pháp xử lý?
public class Receiver : IReceiver
{
public event EventHandler Received;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (Received != null)
{
foreach (EventHandler delegateMember in Received.GetInvocationList())
{
Received -= delegateMember;
}
}
}
}
}
Mã này hoạt động trong khi tôi vứt bỏ lớp học của tôi bất kỳ sự kiện được nối với trường hợp nhận, sẽ được xóa riêng lẻ.
Tôi đã tự hỏi nếu hơn là để tiết về nó, nếu phiên bản ngắn gọn sau đây sẽ có tác dụng tương tự
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
Received = null;
}
}
Về cơ bản này đi xuống đến bao quá tải toán tử đã được tạo ra bởi Microsoft khi triển khai quá tải ủy nhiệm. Tôi biết rằng tất cả tài liệu hướng dẫn đều sử dụng dấu + = để đăng ký và - = để hủy đăng ký khỏi sự kiện. Tôi cũng đã thấy tài liệu nói rằng sự kiện sẽ được gán cho null khi người đăng ký cuối cùng bị xóa. Những gì các tài liệu không nói là liệu gán sự kiện để null, sẽ có tác dụng hủy đăng ký tất cả các sự kiện?
Tôi rất muốn biết nếu điều này là có thể, và nếu có bất kỳ tài liệu nói rằng mã ngắn gọn nhất có thể là hành vi đúng.
Cập nhật:
Tôi đã làm một số đào hơn với C# biên dịch và đã phát hiện ra rằng sự phân công null chỉ hoạt động trong phạm vi lớp học, nơi sự kiện được định nghĩa. Các + = và - = luôn luôn có sẵn từ cả bên trong và bên ngoài lớp. Điều này khiến tôi nghĩ rằng việc sử dụng phiên bản = null có thể chấp nhận được. Tuy nhiên, đây là suy đoán, tôi vẫn chưa thấy bất kỳ tài liệu nào nêu rõ rằng đây là chức năng được hỗ trợ.
@DStanley Các đại biểu sẽ vẫn được tham khảo các đối tượng, vâng, nhưng các đại biểu bản thân sẽ không còn được bắt nguồn từ, hoặc truy cập từ một gốc, vì vậy nó sẽ không được giữ các đối tượng tham chiếu còn sống. – Servy
Tôi đã kiểm tra một lúc trước khi đăng câu hỏi. Câu hỏi cơ bản là sử dụng = câu sử dụng - =. Trong MSDN gần nhất mà tôi có thể tìm thấy là ở dưới cùng của trang này https://msdn.microsoft.com/en-us/library/ms366768(v=vs.90).aspx nó nói rằng null sẽ được chỉ định khi trường hợp cuối cùng của trình xử lý sự kiện bị hủy đăng ký. –