2016-08-10 138 views
1

大家好抱歉,但你必須得到這個所有的時間,我試圖尋找它,但找不到具體到我所尋找的。VB.NET事件處理程序的C#

基本上我完全瞭解VB.NET,並且我經常使用它,我想進入的是C#,所以我決定用我的空閒時間嘗試並掌握它。我這樣做是通過使用我自己舊的VB.NET自定義二進制對象之一併手動轉換它(不是真的使用轉換器,因爲我想學習它,而不僅僅是轉換它。)然而,我正在使用互聯網來指導我。到目前爲止,我試圖創建自定義的處理程序,我以前的VB.NET代碼如下;

Public Event BeforeExecution_Handler() 

但在C#這樣做似乎更棘手一點,我已經做了以下

public event BeforeExecution_HandlerEvent BeforeExecution_Handler; 
public delegate void BeforeExecution_HandlerEvent(); 

沒有首先這是正確的,但其次這到底是怎麼回事,爲什麼我有爲其創建兩次定義。我有一個猜測,委託部分是你放變量的地方,但爲什麼它是這樣的。有人能解釋

+0

'公共事件EventHandler BeforeExecution_Handler;'? –

+0

嗨,是的,我知道這一點,但我不只是想轉換它,我想學習它。因此,爲什麼我採取了這種方法,否則我將依賴這些工具永遠不知道實際需要什麼。這個問題再次涉及爲什麼我需要事件和委託,我錯過了什麼? –

+0

我不明白 –

回答

4

在VB.NET,你可以隱含創建一個委託,所以你可以做這樣的事情:

聲明:

Public Event MsgArrivedEvent(ByVal message As String) 'behind the scenes a delegate is created for you 

調用:

RaiseEvent MsgArrived("foo") 

在C#中你有使用委託。

聲明:

public delegate void MsgArrivedEventHandler(string message); 
public event MsgArrivedEventHandler MsgArrivedEvent; 

調用:

MsgArrivedEvent("Test message"); 

請注意,您還可以明確 VB.NET中以同樣的方式爲C#創建一個委託,但是這僅僅是更多打字沒有增益真的:

聲明:

Public Delegate Sub MsgArrivedEventHandler(ByVal message As String) 
Public Event MsgArrivedEvent As MsgArrivedEventHandler 

調用:

RaiseEvent MsgArrivedEvent("foo") 

還要注意的是最好的做法實際上是用使用senderEventArgs類(或它繼承的類)作爲參數傳遞到事件/委託:

public delegate void MsgArrivedEventHandler(object sender, EventArgs e); 
+0

還值得一提的是,在大多數情況下,使用'EventHandler'或通用版本'EventHandler '就足夠了。第一個會給你一個委託void EventHandler(object sender,EventArgs e'用於空EventArgs。後者給你一樣的,但用你自定義的'TEventArgs'作爲第二個參數。 –