c# - 为什么C#不像VB那样有Handles子句?

标签 c# wpf vb.net xaml events

在 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/

相关文章:

c# - WebApi 2 HttpPut、HttpDelete、HttpPost 不起作用 - HTTP 错误 405.0 - 不允许方法

c# - JSON 序列化程序在自定义 JsonConverter 中序列化自定义数据类型时添加额外字符作为响应 '\'

c# - 图像查看器和高内存使用率

vb.net - 计算字符串中特定字符的出现次数

asp.net - 当我单击其中一个更新面板中的按钮时,如何防止所有更新面板重新加载?

c# - 小巧玲珑.NET : problems with struct parameterized queries

c# - 并行处理并将列表一分为二 - 它会加速整个操作吗?

wpf - 使用 SelectionMode = Multiple 对 ListBox 进行数据绑定(bind)

c# - "No imaging component suitable to complete this operation was found."

sql - 违反 UNIQUE KEY 约束无法在对象中插入重复的键