2010-02-04 40 views
1

我有大約在C#中的事件一些真正的混淆vb.net程序設計師的困惑......如果我有這樣的代碼在一個接口:C#的活動 - 從

Event OnBeforeSaving(ByVal Sender As TEntity, ByVal EventArgs As CancelEventArgs) 

究竟應該如何在C#?當我通過一個轉換器運行它,它給了我這個

event OnBeforeSavingEventHandler OnBeforeSaving; 
delegate void OnBeforeSavingEventHandler(TEntity Sender, CancelEventArgs EventArgs); 

我不知道,如果我知道是怎麼回事......在我腦海中的代碼應該結合。它是否正確?

event OnBeforeSaving(TEntity Sender, CancelEventArgs EventArgs); 

回答

9

我不確定我是否理解發生了什麼......在我的腦海裏,代碼應該合併。它是否正確?

不可以。在VB.NET中,您可以將它合併到一行中。 Event關鍵字允許您指定正在處理的委託類型的完整簽名。

在C#中,但是,你需要明確地告訴該類型的委託,將使用該事件。如果它不是標準的委託類型,那麼你也必須聲明委託。這是你的轉換器爲你做的。

話雖這麼說,在這種情況下,這樣的:

delegate void OnBeforeSavingEventHandler(TEntity Sender, CancelEventArgs EventArgs); 
event OnBeforeSavingEventHandler OnBeforeSaving; 

大概應該是與此代替:

event EventHandler<CancelEventArgs> OnBeforeSaving; 

這是因爲有一個內置的框架EventHandler<T>類型,遵循建議的事件模式,它指定發件人應該是System.Object,並且EventArgs應該是EventArgs的子類。這與VB.NET代碼不太一樣,但是,因爲您將發件人限制爲TEntity類型。

更妙的是使用內置CancelEventHandler類型:

event CancelEventHandler OnBeforeSaving; 

這基本上等同於EventHandler<CancelEventArgs>,但更期望的,因爲有一個框架事件處理專門爲取消類型。

+1

'CancelEventArgs'具有特定的匹配委託類型。熟悉這個事件的用戶可能會根據以前的經驗將'+ = new CancelEventHandler ...':http://msdn.microsoft.com/en-us/library/system.componentmodel.canceleventhandler.aspx – 2010-02-04 18:37:26

+0

真的很好, ...在這種情況下,它不會在任何一種之前工作;)但是在這裏,使用CancelEventHandler將是最有意義的。 – 2010-02-04 18:43:12

+0

編輯添加 - 謝謝280Z28! – 2010-02-04 18:45:01

1

.NET需要的事件是一個委託類型。

VB編譯器會自動創建委託類型; C#編譯器會強制你自己創建它。

0
event EventHandler<CancelEventArgs> OnBeforeSaving; 
0

這條線:

delegate void OnBeforeSavingEventHandler(TEntity Sender, CancelEventArgs EventArgs); 

定義了一個新類型稱爲 「OnBeforeSavingEventHandler」。它是一個委託類型,它定義了一個方法調用,它使用TEntity和CancelEventArgs參數並不返回任何內容。

這條線:

event OnBeforeSavingEventHandler OnBeforeSaving; 

聲明一個類成員,它被稱爲 「OnBeforeSaving」 的事件。此事件類型爲「OnBeforeSavingEventHandler」。因此,任何希望訂閱此事件的對象都必須具有與「OnBeforeSavingEventHandler」委託類型兼容的方法。