在 VB 中,我们有 Handles 子句,它允许将处理程序添加到控件的事件中,而无需将其放入 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 子句可靠。
我的问题是:
为什么它从未实现过?不靠谱?不安全?有什么解决方法吗?
最佳答案
它从未被实现,因为 Microsoft 没有人认为它有用到足以证明这一努力是合理的。确切原因只能由 C# 团队中的某人回答。虽然 C# 和 VB 确实努力同步它们的功能,但这并不意味着它们将追溯地在 C# 中引入所有特定于 VB 的功能,反之亦然。 (注意 Handles
子句一直存在于 VB.NET 中)
但是,可以根据 VB 作为一种语言的历史推测它可能被引入的原因。即,这就是 NET 之前的 VB 事件始终工作的方式,因此 VB 开发人员可能会习惯它。
在传统的 VB 中,事件通过名称连接到对象。如果您有一个 Form
并且定义了一个名为 Form_Load
的子例程,它将作为表单的 Load
事件运行。这种传统延续到 ASP 中,并且仍然作为 AutoEventWireup
存在。配置选项。 VB 开发人员习惯了这种语言,无需向编译器“解释”即可知道针对哪些事件运行何种方法。
在 .NET 语言中,事件只是一种特殊类型的属性(委托(delegate)类型),必须像任何其他属性一样分配。但是,为了让 VB 开发人员轻松过渡到 VB.NET,您最好为他们提供一种简单的方法,而无需了解事件、委托(delegate)和处理程序(至少不是立即)。 Handles
关键字实现了这一点——您只需将 Handles Load
添加到您的 Form_Load
子组件上,它就变成了一个事件处理程序。
另一方面,C# 没有需要维护的遗留行为。 C# 的目标受众包括使用多种语言的人,其中大多数人没有内置的事件概念,当然也没有 VB 的自动连接行为。因此,没有必要将此行为引入语言中,相反,新的 C# 开发人员只需从一开始就学习做事的“正确方法”。
随着 WPF 和 MVVM View /模型分离的引入以及对最小代码隐藏的插入,handles
关键字变得更具吸引力,但它似乎仍然违背了一般原则C# 如何处理事件。我怀疑需要非常非常有力的论据才能让 C# 团队相信它值得实现。
关于c# - 为什么C#不像VB那样有Handles子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18879219/