0

我已经使用了几乎所有的转换工具来将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 似乎提供了事件处理程序的最干净的转换)给出了以下结果:

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

4 回答 4

4

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

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

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

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

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

于 2013-08-06T15:05:06.670 回答
1

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

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

于 2013-08-06T15:05:59.217 回答
1

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

是的,转换工具是对的


解释

VB.NETHandles相当于PreRender += Page_PreRender;.

Handles基本上在后台做同样的事情;添加事件处理程序。

所以Codesnippet #1Codesnippet #2是相同的,除了你需要在 #2 中自己管理处理程序(就像在 Windows 窗体被处置时删除处理程序一样)。

代码片段 #1 (VB.NET)

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

代码片段 #2 (VB.NET)

AddHandler Me.PreRender, AddressOf Page_PreRender

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

于 2013-08-06T15:09:46.910 回答
1

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

查看 MSDN会引发PreRender 事件。

原始代码不是处理程序,而是调用程序。OnPreRender被要求加注PreRender。如果在 VB 代码中提出PreRenderPage_PreRender会导致无限递归。

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

于 2013-08-06T15:24:35.720 回答