对事件处理程序的VB / C#转换感到困惑

时间:2013-08-06 14:54:32

标签: c# asp.net vb.net

我已经使用了几乎所有转换工具将VB.NET的代码段转换为C#。除了转换中的一些差异之外,我遇到麻烦的一件事是事件处理程序转换。看一些纯C#代码,我看到这样的事情:

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);
    ...
}
查看MSDN

引发了PreRender事件。好。现在,拿一些VB.NET代码:

Private Sub Page_PreRender(ByVal sender As Object, 
    ByVal e As System.EventArgs) Handles Me.PreRender
....
EndSub

处理相同的PreRender事件并使用转换工具(DeveloperFusion seemed to give the cleanest conversion of the Event Handler)进行翻译)得出此结果:

public class MyClass : UserControl
{
    private void Page_PreRender(object sender, System.EventArgs e)
    {
        ...
    }

    public MyClass()
    {
        PreRender += Page_PreRender;
    }
}

对此我不熟悉,我的主要问题是上面列出的原始(或纯粹)C#代码是否与转换后的C#代码基本相同(除了object sender部分之外)?如果不是,我将非常感谢您的简短解释。

基本上,我只是想知道PreRender += Page_PreRender;部分是否是多余的。

4 个答案:

答案 0 :(得分:4)

第一个C#代码块表示基类的OnPreRender函数的覆盖,而第二个是PreRender事件的事件处理程序。

是的,它们是不同的,但在功能上它们或多或少是等效的,因为正如您提到的基类OnPreRender函数将触发PreRender事件。

本质上,它代表了两种完成同一事情的方法,你选择的机制主要是语义问题。我主要是因为可能存在明确的理由选择一种方法而不是另一种方法,但如果您不知道任何方法,只需选择一种方法。

我更喜欢自己覆盖,因为您通常使用事件向外部侦听器而不是对象的派生实例广播通知。

PreRender += Page_PreRender在您的示例中并不是多余的,因为在使用该机制时需要连接事件处理程序。您发布的VB版本是使用事件而不是覆盖实现的,因此转换是正确的。这些事件的“连线”在VB.net中是隐含的,因此您将无法在VB版本中找到等效语句。

答案 1 :(得分:1)

  

PreRender += Page_PreRender;部分是多余的吗?

不 - 该代码是C#分配事件处理程序的方式,在VB中使用Handles Me.PreRender子句完成。

答案 2 :(得分:1)

  

作为一个n00b,我的主要问题是原始是否(或   纯粹的)上面列出的C#代码基本上是一样的   转换后的C#代码。

是的,转换工具正确


<强>解释

VB.NET的Handles相当于PreRender += Page_PreRender;

Handles基本上在背景中做同样的事情;添加一个事件处理程序。

所以 Codesnippet#1 Codesnippet#2 是相同的,除了你需要在#2中自己管理处理程序(就像在Windows中删除处理程序一样)表格处理完毕。)

Codesnippet#1(VB.NET)

Private Sub Page_PreRender(ByVal sender As Object, 
    ByVal e As System.EventArgs) Handles Me.PreRender
....
End Sub

Codesnippet#2(VB.NET)

AddHandler Me.PreRender, AddressOf Page_PreRender

很明显,没有转换的代码是多余的。

答案 3 :(得分:1)

转换已正确完成,但 等效于原始C#:

  

查看MSDN,提升 PreRender事件。

原始代码不是处理程序,它是一个调用者。调用OnPreRender来提升PreRender。如果VB代码在PreRender中引发Page_PreRender,则会导致无限递归。

可覆盖的“On [event name]”模式用于允许子类“处理”事件,但它与处理程序不同。对base / MyBase的调用实际上会引发事件,因此基本上通过覆盖其中一种方法,您可以强制操作在之前或之后完全发生(取决于您调用基数的位置)调用所有事件处理程序。