2016-08-10 141 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'作为第二个参数。 –