2012-03-01 23 views
7

Tôi có một mã như thế này:Thiết lập một tổ chức sự kiện để Null

public class SomeClass 
{ 
    int _processProgress; 
    public int ProcessProgress 
    { 
     get { return _processProgress; } 
     set 
     { 
      _processProgress = value; 
      if (ProcessProgressChanged != null) 
       ProcessProgressChanged(value); 
     } 
    } 

    public delegate void ProcessProgressChangedEventHandler(int progressPercentage); 
    public event ProcessProgressChangedEventHandler ProcessProgressChanged; 

    public void ClearProcessProgressChangedEvent() 
    { 
     this.ProcessProgressChanged = null; 
    } 
} 

Will nó unsubscribe tất cả các phương pháp trong trường hợp ProcessProgressChanged khi tôi gọi phương thức ClearProcessProgressChangedEvent()?

Mã của tôi nằm trong C#, khung 4, được xây dựng trong VS2010 Pro, dự án ở dạng Winforms.

Vui lòng trợ giúp. Cảm ơn trước.

+2

Câu hỏi này không trùng lặp. Trong câu hỏi đó, họ đang hỏi về việc thiết lập đối tượng - được đăng ký với sự kiện - để null. Câu hỏi này họ đang hỏi về việc thiết lập các sự kiện chính nó để null. – Wes

Trả lời

14

Vâng, nó sẽ xóa danh sách người đăng ký hiệu quả, có (bằng cách đặt trường đại biểu cơ bản thành null) - để lần sau ProcessProgress được đặt, sẽ không có trình xử lý nào được gọi. Nó không thực sự đặt sự kiện thành null - thiết lập trường cơ bản là null. Nó chỉ là trình biên dịch C# đang tạo cả một sự kiện (một cặp đăng ký/hủy đăng ký các phương thức) và một trường (để lưu trữ các trình xử lý) bằng cách sử dụng một khai báo đơn.

Bạn có thể tìm thấy article about events and delegates hữu ích của mình.

Lưu ý rằng mã tăng sự kiện của bạn hiện không an toàn với luồng. Tôi không biết liệu nó cần phải được hay không, nhưng bạn có thể muốn xem xét sử dụng:

set 
{ 
    _processProgress = value; 
    var handlers = ProcessProgressChanged; 
    if (handlers != null) 
    { 
     handlers(value); 
    } 
} 

Bằng cách đó bạn sẽ không nhận được một NullReferenceException nếu xử lý cuối cùng là bỏ đăng ký sau cách huỷ bỏ kiểm tra nhưng trước khi yêu cầu.

+1

Xin cảm ơn và cảm ơn một lần nữa vì mẹo _thread-safe_. –

+0

Jon, bạn có biết rằng nếu đăng ký các đại biểu vô danh cho một sự kiện và sau đó xóa sự kiện bằng cách gán nó cho null có thể ngăn chặn việc thu thập rác trên các đối tượng được tham chiếu, ví dụ, biểu thức lambda? – Apelsin

+1

@Apelsin: Bạn phải đưa ra một ví dụ cụ thể hơn, thành thật - có thể trong một câu hỏi mới. Nhưng nếu trường cơ bản của sự kiện được đặt thành null, tôi không thể thấy điều gì sẽ ngăn chặn việc thu gom rác thải. –

3

Có, nó sẽ hủy đăng ký mọi người khỏi sự kiện. Có một (bit gián tiếp IMHO) tham chiếu đến here này:

Khi tất cả các thuê bao đã hủy đăng ký từ một sự kiện, ví dụ sự kiện trong lớp nhà xuất bản được thiết lập để null.

Các vấn đề liên quan