Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用事件处理程序从VB.NET到C#_C#_.net_Vb.net_Delegates_Vb.net To C# - Fatal编程技术网

使用事件处理程序从VB.NET到C#

使用事件处理程序从VB.NET到C#,c#,.net,vb.net,delegates,vb.net-to-c#,C#,.net,Vb.net,Delegates,Vb.net To C#,大家好,很抱歉,但你必须得到这个所有的时间,我已经试图寻找它,但无法找到任何具体的东西,我正在寻找 基本上,我对VB.NET非常了解,我经常使用它,我想进入C#,所以我决定利用我的空闲时间来尝试掌握它。我使用一个旧的VB.NET自定义二进制对象并手动转换它(不是真正使用转换器,因为我想学习它,而不仅仅是转换它)。然而,我使用互联网来指导我。到目前为止,我正在尝试创建自定义处理程序,甚至我以前的VB.NET代码如下所示 Public Event BeforeExecution_Handler()

大家好,很抱歉,但你必须得到这个所有的时间,我已经试图寻找它,但无法找到任何具体的东西,我正在寻找

基本上,我对VB.NET非常了解,我经常使用它,我想进入C#,所以我决定利用我的空闲时间来尝试掌握它。我使用一个旧的VB.NET自定义二进制对象并手动转换它(不是真正使用转换器,因为我想学习它,而不仅仅是转换它)。然而,我使用互联网来指导我。到目前为止,我正在尝试创建自定义处理程序,甚至我以前的VB.NET代码如下所示

Public Event BeforeExecution_Handler()
但用C#做这件事似乎有点棘手,我做了以下几点

public event BeforeExecution_HandlerEvent BeforeExecution_Handler;
public delegate void BeforeExecution_HandlerEvent(); 
没有第一个是正确的,但是第二个是,为什么我必须为它创建两次定义呢。我猜委托部分是放置变量的地方,但为什么是这样呢。有人能解释一下吗?在VB.NET中,您可以隐式创建一个委托,这样您就可以执行以下操作:

声明:

Public Event MsgArrivedEvent(ByVal message As String) 'behind the scenes a delegate is created for you
public delegate void MsgArrivedEventHandler(string message);
public event MsgArrivedEventHandler MsgArrivedEvent;
Public Delegate Sub MsgArrivedEventHandler(ByVal message As String)
Public Event MsgArrivedEvent As MsgArrivedEventHandler
调用:

RaiseEvent MsgArrived("foo")
MsgArrivedEvent("Test message");
RaiseEvent MsgArrivedEvent("foo")
在C#中,必须使用委托

声明:

Public Event MsgArrivedEvent(ByVal message As String) 'behind the scenes a delegate is created for you
public delegate void MsgArrivedEventHandler(string message);
public event MsgArrivedEventHandler MsgArrivedEvent;
Public Delegate Sub MsgArrivedEventHandler(ByVal message As String)
Public Event MsgArrivedEvent As MsgArrivedEventHandler
调用:

RaiseEvent MsgArrived("foo")
MsgArrivedEvent("Test message");
RaiseEvent MsgArrivedEvent("foo")

请注意,您也可以在VB.NET中以与C#相同的方式显式创建委托,但这只是更多的键入,实际上没有任何好处:

声明:

Public Event MsgArrivedEvent(ByVal message As String) 'behind the scenes a delegate is created for you
public delegate void MsgArrivedEventHandler(string message);
public event MsgArrivedEventHandler MsgArrivedEvent;
Public Delegate Sub MsgArrivedEventHandler(ByVal message As String)
Public Event MsgArrivedEvent As MsgArrivedEventHandler
调用:

RaiseEvent MsgArrived("foo")
MsgArrivedEvent("Test message");
RaiseEvent MsgArrivedEvent("foo")

还请注意,最佳做法实际上是使用
发送方
EventArgs
类(或从中继承的类)作为事件/委托的参数:

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

执行前公共事件事件处理程序\u处理程序?嗨,是的,我知道这一点,但我不只是想转换它,我想学习它。因此,我为什么要采用这种方法,否则我将依赖于这些工具,永远不知道实际需要什么。同样,这个问题是关于为什么我需要事件和委托,我是否遗漏了什么?我不明白,我从来没有像你那样在VB.NET中声明过事件。通常我将它们声明为:
Public Event MyEvent As EventHandler
。我猜当您删除作为EventHandler的
部分时,VB编译器会自动为您创建一个委托。然而,在C#中,这似乎没有实现,这就是为什么您需要自己创建它。
Delegate
是一个指向方法的指针,事件需要该方法,以便它们知道预期的参数。另外值得一提的是,在大多数情况下,使用
EventHandler
或通用版本
EventHandler
就足够了。第一个参数将为您提供一个
委托void EventHandler(对象发送方,EventArgs e
),用于空的EventArgs。后一个参数将为您提供相同的参数,但第二个参数是自定义的
tevenargs