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

为什么C#没有像VB那样的Handles子句?,c#,wpf,vb.net,xaml,events,C#,Wpf,Vb.net,Xaml,Events,在VB中,我们有Handles子句,它允许向控件的事件添加处理程序,而无需将其放入xaml文件(直接放入VB文件) xaml: 使用它可以做的一件好事是,可以使用VisualStudio下拉菜单自动添加事件,而无需转到xaml文件并对其进行更改。阅读此问题(及答案)以更好地理解我所说的内容: 这个问题的答案没有说明为什么C#在visualstudio中没有此功能,但我很清楚:C#没有此功能,因为它使用Handles子句在codebeard上添加事件 我知道我们可以使用+=在构造函数上手动添加事

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

xaml:

使用它可以做的一件好事是,可以使用VisualStudio下拉菜单自动添加事件,而无需转到xaml文件并对其进行更改。阅读此问题(及答案)以更好地理解我所说的内容:

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

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

我的问题是:


为什么它从未实施?不可靠?不安全?有什么解决办法吗?

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

然而,根据VB作为一种语言的历史,我们可以推测它为什么会被引入。也就是说,VB events pre-NET总是这样工作的,所以VB开发人员可能会习惯它

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

在.NET语言中,事件只是一种特殊类型的属性,具有一种特殊类型(委托类型),必须像任何其他属性一样进行分配。不过,为了让VB开发人员能够轻松地过渡到VB.NET,您最好为他们提供一种简单的过渡方式,而无需了解事件、委托和处理程序(至少不需要立即了解)。
Handles
关键字实现了这一点——您只需将
Handles Load
添加到
Form\u Load
sub中,它就变成了一个事件处理程序

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


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

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

然而,根据VB作为一种语言的历史,我们可以推测它为什么会被引入。也就是说,VB events pre-NET总是这样工作的,所以VB开发人员可能会习惯它

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

在.NET语言中,事件只是一种特殊类型的属性,具有一种特殊类型(委托类型),必须像任何其他属性一样进行分配。不过,为了让VB开发人员能够轻松地过渡到VB.NET,您最好为他们提供一种简单的过渡方式,而无需了解事件、委托和处理程序(至少不需要立即了解)。
Handles
关键字实现了这一点——您只需将
Handles Load
添加到
Form\u Load
sub中,它就变成了一个事件处理程序

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


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

不同的语言有不同的特性。谁会选择h
<Button x:Name="myButton" />
Private Sub Button_Click() Handles myButton.Click

End Sub