2009-02-24 244 views
1

在C#是什麼C#事件訂閱

public class blah 
{ 

     public event EventHandler Blahevent; 

} 

public class blah 
{ 

     private event EventHandler blahevent; 

     public event EventHandler Blahevent 
     { 
      add 
       { 
        blahevent+=value; 
       } 
       remove 
       { 
        blahevent-=value 
       } 
     } 

} 

反之亦然優勢。

沒有第一個打開你到blahinstance.Blahevent = null;或者blahinstance.Blahevent(OBJ,偶數)

+0

你能做到 blahinstance.Blahevent = null 或blahinstance.Blahevent(obj,even),如果它只是一個公共? – maxfridbe 2009-02-24 20:28:35

回答

2

除非你想做一些不同的事情,否則顯式實現add/remove方法沒有任何優勢。可能的原因:

  • 也許採取事件後盾代碼自己(直接鏈接到其他一些事件,而不是去雖然例如一個毫無意義的級聯)
  • 做別的事情,除了添加或刪除
  • 的控制在添加
  • 更改安全需求或刪除
  • 露出下面的委託

什麼的默認實現所做的是保持自己的私人藏委託場是REPL每次代表添加或刪除代表時都會發生。對於大多數情況,不需要做任何上述操作,但靈活性在那裏。

1

第二個具有控制指定事件訂閱確切地會發生什麼的選項或如果除了添加或刪除指針之外還有需要運行的特定邏輯,則取消訂閱。

1

您可以使用專用字段上的[field:NonSerialized()]屬性將序列化中的委託排除在外。

+0

我不明白?事件是否被序列化? – maxfridbe 2009-02-24 20:27:44

1

爲了調試目的,您可以在後者上放置一個斷點。有時這可能是確實有用(雖然調試後我將其切換回前者)。