我刚刚从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在控件所在的主类中创建。
这是对的吗?我在这里错过了什么吗?
答案 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
关键字或AddHandler
和AddressOf
运算符订阅活动。 Visual Studio对设计器生成的事件使用Handles
关键字。因为事件处理程序必须位于代码隐藏文件中而不是设计器文件中,所以在编辑文件后面的代码时可以看到它们。如果Visual Studio使用AddHandler
,它会将该代码插入到设计器代码文件中的InitializeComponent
方法中。
另一方面,C#只有一个运算符(+=
)才能订阅事件。因此,该代码进入设计器文件而不是代码隐藏文件,以避免将设计器生成的代码与用户代码混合。
希望这有帮助!
答案 3 :(得分:0)
是的,这是正确的,设计人员在生成的* .designer.cs文件中创建它。您当然可以使用相同的语法手动创建事件处理程序。此行为是通过部分类功能实现的,您可以在其中定义不同文件中的类的部分。
答案 4 :(得分:0)
将+=
视为AddHandler
与AddressOf
答案 5 :(得分:0)
修改到Form1.cs [Design]中的所有内容都将在Form1.Deisgner.cs中包含代码部分 这就是C#.NET知道如何使东西出现的方式。
它应该在你的Form1.cs中创建了一些代码,你可以实际填充事件中的内容。