为什么C#没有像VB这样的Handles子句?

时间:2013-09-18 18:03:47

标签: c# wpf vb.net xaml events

在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一样可靠(对我而言)。

我的问题是:

为什么它从未实施过?这不可靠吗?非安全?有什么解决方法吗?

1 个答案:

答案 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子上,它就会成为事件处理程序。

另一方面,C#没有需要维护的遗留行为。 C#的目标受众包括来自多种语言的人,其中大多数没有内置的事件概念,当然也没有VB的自动连线行为。所以没有必要在语言中引入这种行为,相反,新的C#开发人员只会从一开始就学习“正确的方法”。

随着WPF和MVVM视图/模型分离的引入以及对最小代码隐藏的推动,handles关键字变得更有吸引力,但它仍然违背了C#如何处理的一般原则事件。我怀疑要让C#团队相信它值得实施需要一个非常强大的论据。