2013-08-06 58 views
0

我已经使用几乎所有的转换工具将VB.NET的片段转换为C#。除了转换的一些差异之外,我遇到麻烦的一件事是事件处理程序转换。纵观一些纯C#代码,我看到这样的事情:对事件处理程序的VB/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部分相同)?如果不是简单的解释将不胜感激。 10基本上,我只是想知道PreRender += Page_PreRender;部分是多余的。

+1

你的第一个C#代码块没有引发事件,它只是事件处理程序,事件处理程序仍然会被连接到某个地方。最后一个块中的+ =将事件连接到处理程序,该处理程序是VB.NET句柄关键字 –

+0

@chriswarner的呃嗯,你是对的。对不起,我的困惑在于一个类文件和一个代码隐藏。但是,转换后的代码是否适合类文件?也就是说,转换文件中的接线是“最佳实践”? – REMESQ

+1

@chris:不,第一个C#代码块没有事件处理程序,它根本没有使用事件或代理。 –

回答

4

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

是的,它们是不同的,但在功能上他们更多或更少equivialent,因为你提到的基类OnPreRender功能将触发PreRender事件。

从本质上讲,它代表了两种方式来完成相同的事情,你选择的机制大多是一个语义问题。我说主要是因为可能有明确的理由选择一种方法,但如果你不知道任何方法,只需选择一种。

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

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

+0

感谢您的理解。我的困惑还在于继承时使用'OnInit'和'OnLoad'来查看C#类文件(即'MyClass:MyBase')。所以这对我来说更清楚一点。 – REMESQ

+0

@REMESQ没问题!乐意效劳。 – pdriegen

1

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

不 - 这代码是分配事件处理程序,这是在VB与Handles Me.PreRender条款进行的C#的方式。

+0

“我的主要问题是,上面首先列出的原始(或纯粹的)C#代码是否与转换后的C#代码” –

1

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

是的,转换工具是正确


说明

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

Handles基本上在背景中完全相同的东西;添加一个事件处理程序。

所以Codesnippet#1Codesnippet#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 

所以,很显然,没有转换的代码是多余的。

+0

“基本相同,我的主要问题是原始(或纯粹的)C#代码是否首先在上面列出基本上和转换后的C#代码一样“ –

+0

@BenVoigt谢谢 –

1

转化率做得正确,但它是不相当于原来的C#:

其看MSDN,提高 PreRender事件。

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

可重写的“On [event name]”模式用于允许子类“处理”事件,但它与处理程序不同。对base/MyBase的调用实际上引发了事件,所以基本上通过覆盖这些方法中的一个,迫使某个操作在完成之前或之后完成(取决于您调用基地的位置),将调用所有事件处理程序。