在VB中,我们有Handles子句,它允许将Handler添加到控件的事件中,而不将其放入xaml文件中(直接放入VB文件中)。
XAML:
<Button x:Name="myButton" />
VB:
Private Sub Button_Click() Handles myButton.Click
End Sub
使用此功能可以完成的一件好事是可以使用Visual Studio下拉列表自动添加事件,而无需转到xaml文件并进行更改。阅读这个问题(和答案),以便更好地理解我在说什么:
Visual studio 2010 showing available events from code behind
该问题的答案并未说明为什么C#在Visual Studio中没有此功能,但对我来说很明显:C#没有此功能,因为它使用Handles子句在CodeBehind上添加事件。
我知道我们可以使用+ =并在构造函数上手动添加事件,在InitializeComponent下面(这几乎是一样的),但是VB也有AddHandler可以在构造函数上添加事件(并且在其他地方),它不是自动的,也不像Handles一样可靠(对我而言)。
我的问题是:
为什么它从未实施过?这不可靠吗?非安全?有什么解决方法吗?
答案 0 :(得分:5)
它从未实现过,因为微软没有人认为它足以证明这一努力的合理性。确切原因只能由C#团队的某个人来回答。虽然C#和VB已经努力同步它们的功能,但这并不意味着它们将追溯性地在C#中引入所有VB特定的功能,反之亦然。 (请注意,Handles
子句始终存在于VB.NET中)
然而,人们可以推测基于VB的历史作为一种语言,为什么它可能被引入。也就是说,VB之前的VB事件总是如此工作,因此VB开发人员可能会习惯它。
在传统的VB中,事件按名称连接到对象。如果您有Form
并且定义了名为Form_Load
的子例程,则它将作为表单的Load
事件运行。这种传统延续到ASP中,并且仍然是AutoEventWireup
配置选项。 VB开发人员习惯了这种语言,知道为哪些事件运行哪种方法而不必向编译器“解释”。
在.NET语言中,事件只是一种特殊类型的属性,具有特殊类型(委托类型),必须像任何其他属性一样分配。但是,为了让VB开发人员能够轻松地过渡到VB.NET,理想情况下,无需了解事件,代理和处理程序(至少不会立即),就可以轻松地为他们提供这样做。 Handles
关键字实现了这一点 - 您只需将Handles Load
添加到Form_Load
子上,它就会成为事件处理程序。
随着WPF和MVVM视图/模型分离的引入以及对最小代码隐藏的推动,handles
关键字变得更有吸引力,但它仍然违背了C#如何处理的一般原则事件。我怀疑要让C#团队相信它值得实施需要一个非常强大的论据。