1

在 VB 中,我们有 Handles 子句,它允许将 Handler 添加到控件的事件中,而无需将其放入 xaml 文件(直接放入 VB 文件)。

xml:

<Button x:Name="myButton" />

VB:

Private Sub Button_Click() Handles myButton.Click

End Sub

使用它可以完成的一件好事是可以使用 Visual Studio 下拉菜单自动添加事件,而无需转到 xaml 文件并进行更改。阅读这个问题(和答案)以更好地理解我在说什么:

Visual Studio 2010 显示来自代码背后的可用事件

该问题的答案没有说明为什么 C# 在 Visual Studio 中没有此功能,但我很清楚:C# 没有此功能,因为它使用 Handles 子句在 CodeBehind 上添加事件。

我知道我们可以使用 += 并在构造函数上手动添加事件,在 InitializeComponent 下面(几乎是同一件事),但是 VB 也有 AddHandler 可以在构造函数上添加事件(以及在其他地方) ,并且它不是自动的,并且(对我而言)比 Handles 子句更不可靠。

我的问题是:

为什么它从来没有实施过?不靠谱吗?不安全?有什么解决方法吗?

4

1 回答 1

5

它从未实施过,因为微软没有人认为它有用到足以证明这项努力的合理性。确切的原因只能由 C# 团队中的某个人来回答。虽然 C# 和 VB 确实努力同步它们的特性,但这并不意味着它们将在 C# 中追溯引入所有 VB 特定的特性,反之亦然。(注意该Handles子句在 VB.NET 中一直存在)

然而,人们可以根据 VB 作为一门语言的历史来推测它为什么会被引入。也就是说,这就是 VB 事件在 NET 之前的工作方式,因此 VB 开发人员可能会习惯它。

在传统的 VB 中,事件通过名称连接到对象。如果您有 aForm并且您定义了一个名为 的子例程Form_Load,它将作为表单的Load事件运行。这种传统延续到 ASP 中,并且仍然作为AutoEventWireup配置选项存在。VB 开发人员习惯了这种语言,无需向编译器“解释”就可以知道为哪些事件运行什么方法。

在 .NET 语言中,事件只是一种具有特殊类型(委托类型)的特殊属性,必须像任何其他属性一样进行分配。但是,为了使 VB 开发人员能够轻松地过渡到 VB.NET,理想情况下,您应该为他们提供一种简单的方法,而无需了解事件、委托和处理程序(至少不是立即)。关键字实现了这Handles一点——你只需附加Handles Load到你的Form_Loadsub 上,它就会变成一个事件处理程序。

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

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

于 2013-09-18T18:28:48.447 回答