我已经使用了几乎所有转换工具将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;
部分是否是多余的。
答案 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
的调用实际上会引发事件,因此基本上通过覆盖其中一种方法,您可以强制操作在之前或之后完全发生(取决于您调用基数的位置)调用所有事件处理程序。