2012-02-06 24 views
7

Có cách nào bị thông báo khi có một cái gì đó đặt mua một sự kiện trong lớp học của tôi, hay tôi cần phải quấn đăng ký/unsubsription trong các phương pháp ví dụ:Bất kỳ cách nào để được thông báo khi có điều gì đó đăng ký một sự kiện/đại biểu?

public class MyClass : ISomeInterface 
{ 
    public event SomeEventHandler SomeEvent; //How do I know when something subscribes? 

    private void OnSomeEventSubscription(SomeEventHandler handler) 
    { 
      //do some work 
    } 

    private void OnSomeEventUnsubscription(SomeEventHandler handler) 
    { 
      //do some work 
    } 
} 

thay vì

public class MyClass : ISomeInterface 
{ 
    private SomeEventHandler _someEvent; 

    public void SubscribeToSomeEvent(SomeEventHandler handler) 
    { 
      _someEvent += handler; 

      //do some work 
    } 

    public void UnsubscribeFromSomeEvent(SomeEventHandler handler) 
    { 
      _someEvent -= handler; 

      //do some work 
    }  
} 

Lý do Tôi hỏi là vì sự kiện này đã được hiển thị trực tiếp trên ISomeInterface nhưng việc triển khai cụ thể này cần phải biết khi nào công cụ đăng ký/hủy đăng ký.

Trả lời

10

Bạn có thể viết accessors tùy chỉnh cho sự kiện của bạn:

private SomeEventHandler _someEvent; 
public event SomeEventHandler SomeEvent 
{ 
    add 
    { 
     _someEvent += value; 
     Console.WriteLine("Someone subscribed to SomeEvent"); 
    } 
    remove 
    { 
     _someEvent -= value; 
     Console.WriteLine("Someone unsubscribed from SomeEvent"); 
    } 
} 
+1

Lưu ý rằng với đăng ký sự kiện mã này không an toàn. Một cách dễ dàng để đạt được điều đó là đánh dấu '_someEvent' là sự kiện. – CodesInChaos

+0

Rực rỡ, cảm ơn! – GazTheDestroyer

1

Thomas đã trả lời này đã nhưng nghĩ rằng tôi cũng muốn nói thêm rằng bạn có thể cần để khóa bất kỳ phần quan trọng trong việc bổ sung loại bỏ phần từ thuê bao sự kiện là không bao giờ thread an toàn, tức là bạn không có ý tưởng ai sẽ kết nối với bạn hoặc khi nào. Ví dụ:

private readonly object _objectLock = new object(); 
    private SomeEventHandler _someEvent; 

    public event SomeEventHandler SomeEvent 
    { 
     add 
     {  
      lock(_objectLock) 
      { 
       _someEvent += value; 
       // do critical processing here, e.g. increment count, etc could also use Interlocked class. 
      } // End if 
     } // End of class 
     remove 
     { 
      lock(_objectLock) 
      { 
       _someEvent -= value; 
       // do critical processing here, e.g. increment count, etc could also use Interlocked class. 
      } // End if 
     } // End if 
    } // End of event 
+0

Bạn quên bao gồm '_someEvent'. Nếu nó chỉ là một trường, mã của bạn cũng không an toàn. – CodesInChaos

+0

Có bạn đúng - C# 4.0 cung cấp cho bạn một khóa ẩn nếu bạn khai báo _someEvent như một sự kiện giống như trường, vì vậy nếu đó là "sự kiện riêng tư SomeEventHandler _someEvent", thì khóa bên trong thêm/xóa để thêm/xóa giá trị không được yêu cầu. – Jeb

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