WinForms Designer自动创建的事件处理程序

时间:2010-06-18 14:13:02

标签: c# vb.net event-handling

我刚刚从VB.NET转到C#。在VB中,要将事件处理程序连接到Sub,我们使用 Handles 子句。

从它看来,这在C#中不存在。

使用按钮创建一个简单的应用程序后,我意识到Window Forms Designer自动为我的button1_Click函数创建了一个EventHandler(在我双击它之后),在 Form1.Designer.cs 中使用以下代码:

this.button1.Click += new System.EventHandler(this.button1_Click);

但是在VB中,WinForms Designer在我的类中,在函数头中创建了Handles子句。

因此,C#在设计器文件中创建默认的EventHandler,而VB在控件所在的主类中创建。

这是对的吗?我在这里错过了什么吗?

6 个答案:

答案 0 :(得分:7)

你是对的,因为在C#中没有类似于VB.NET handles子句(或相应的WithEvents变量装饰器)。这些只存在于VB.NET中作为来自经典VB的延迟,并且它们在使用中有开销(生成的IL实际上必须监视设置变量的所有地方,以便分离和附加handles的所有函数那个事件)。

如果您检查用于VB.NET表单或控件的IL,您实际上会发现为每个WithEvents变量创建了一个属性,并且setter会小心从旧值中删除所有实际处理程序(假设它是非null)并将它们附加到新值(假设它是非null)。

VB.NET中C#事件处理的模拟是AddHandler语句。

答案 1 :(得分:1)

VB Handles关键字只是语法糖,基本上与你在C#中看到的相同。你可以用同样的方式编写VB,但为什么会这样?

C#方法(可以在VB中模拟)确实允许更大的灵活性(即为两个不同的控件调用相同的方法)。

答案 2 :(得分:1)

此行为绝对正确,您不会错过任何内容。

在VB中,您可以使用Handles关键字或AddHandlerAddressOf运算符订阅活动。 Visual Studio对设计器生成的事件使用Handles关键字。因为事件处理程序必须位于代码隐藏文件中而不是设计器文件中,所以在编辑文件后面的代码时可以看到它们。如果Visual Studio使用AddHandler,它会将该代码插入到设计器代码文件中的InitializeComponent方法中。

另一方面,C#只有一个运算符(+=)才能订阅事件。因此,该代码进入设计器文件而不是代码隐藏文件,以避免将设计器生成的代码与用户代码混合。

希望这有帮助!

答案 3 :(得分:0)

是的,这是正确的,设计人员在生成的* .designer.cs文件中创建它。您当然可以使用相同的语法手动创建事件处理程序。此行为是通过部分类功能实现的,您可以在其中定义不同文件中的类的部分。

答案 4 :(得分:0)

+=视为AddHandlerAddressOf

答案 5 :(得分:0)

修改到Form1.cs [Design]中的所有内容都将在Form1.Deisgner.cs中包含代码部分 这就是C#.NET知道如何使东西出现的方式。

它应该在你的Form1.cs中创建了一些代码,你可以实际填充事件中的内容。