2011-05-18 82 views

回答

6

事件是essentialy屬性,其類型是代表。 event關鍵字的意圖是表示對象觸發的實際事件(即回調函數),而不是簡單地保存委託的屬性。這種區別對於需要向您顯示對象可以觸發什麼事件的GUI工具很重要。當然,這可能是通過註釋完成的,但這不是爲C#選擇的設計。

在Anders Hejlsberg(C#的創建者)的a recent interview中提到,如果他再次設計它,他可能不會讓事件變得如此特別。

2

event關鍵字爲 委託聲明,它允許 被包含在一個接口, 約束它調用從 對其進行聲明的類內的改性劑,提供 它具有一對可定製的 訪問器(添加和刪除)並強制代理的簽名(在.NET框架中使用 時)。

請參閱here一個很好的解釋。

+0

實際上,您可以在界面中添加委託屬性......它與 – digEmAll 2011-05-18 07:07:29

+0

作爲屬性yes基本相同,但不作爲公共字段。 – fearofawhackplanet 2011-05-18 07:10:47

1

用關鍵字event聲明的成員確實是MulticastDelegate。關於它的唯一特點是,儘管您聲明事件public,但您只能從班內調用事件/委託。這是因爲編譯器會生成一個專用字段,存儲委託和公共方法以訂閱和取消訂閱事件。如果您直接使用Delegate,則任何人都可以隨時調用委託人。

所以事件實際上只是一個委託的漂亮封裝。

+0

是的,這對我有幫助;) – user1859587 2012-11-28 18:39:36

2

事件限制代理列表的操作方式,因爲您只能通過+=-=操作員添加和刪除代表。另一方面,由於下面的定義,代表不承擔這個限制。

public event DelegateType Events; 
public DelegateType Delegates; 

你可以做以下

instance.Delegates = null; // clear the list of delegates 

,但是編譯器會阻止你做

instance.Events = null; // doesn't compile 

當編譯Events字段實際上private是,儘管其宣佈爲public和編譯器只需添加用於操作列表的添加/刪除方法即可。

相關問題