添加事件处理程序 - 语法的用途

本文关键字:语法 事件处理 程序 添加 | 更新日期: 2023-09-27 18:31:50

这是一个有趣的问题,直到上周我与一位同事交谈,我才真正思考过。

当我们添加事件处理程序时,我们使用如下语法:

Button1.Click += ClickHandler

据我所知,我们使用 += 与"添加"同义,-= 与"删除"同义。

所以我的问题是,为什么语言创建者选择使用这种语法? 为什么不是 Button1.Click.Add(ClickHandler)?

如果它只是意味着添加,为什么框架创建者不重载 List 的 += 运算符而不是 .添加()?

我想这与解释 AddHandler 和 RemoveHandler 存在的原因相同,VB.Net 但我不知道这个原因是什么。

为什么有用于添加和删除事件处理程序的特殊语言语法?

添加事件处理程序 - 语法的用途

非常主观的问题,定义语法的人不会发布到 SO,所以需要读心术来猜测他们 14 年前的动机。 无论如何都要试一试:

事件与属性完全相同。 就像属性限制对字段的访问一样,事件限制对委托对象的访问。 属性具有吸气剂和二传手。 调用它们只需要 = 符号。 一个就足够了,编译器可以从属性标识符相对于 = 符号的位置确定 setter 还是 getter(左边是 setter,右边是 getter)。

事件有三个访问器:添加、删除和提升。 Raise 不是用 C# 实现的(与其他语言不同),所以我们只需要添加和删除的语法。 我们不能像处理属性那样只使用一个符号,放置没有帮助。 添加最自然的符号是+,因为删除是-。 它也在某种程度上表现为赋值,因为它在逻辑上(在实践中)重新分配基础委托对象。 所以自然的选择是+=-=.

不知道设计师是否真的遵循了相同的逻辑。 VB.NET 设计师当然没有,他们选择了语言关键字来映射到访问器(AddHandler,RemoveHandler,RaiseEvent)。 但是 C# 是那种语法简洁和绝对最少的关键字数量是强大的设计目标的语言。 C++/CLI 与 C# 非常相似,但支持提升访问器,并且根本没有语法糖来创建委托对象。 这为它提供了超越 C# 的功能,它不仅限于将其作为委托目标,该功能称为"未绑定委托"。

最后一点,委托对象创建语法糖 C# 有,但 C++/CLI 没有,这非常重要。 因为如果你把它写出来,你会得到这样的代码:

SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(repaintControls);

这困扰着任何从.NET编程开始的程序员的头脑。 您必须创建新的委托对象才能取消订阅事件???是的,你愿意。 糖更容易理解:

SystemEvents.UserPreferenceChanged -= repaintControls;

无论如何,编译器都会生成相同的代码。 这也是 VB.NET 使用关键字的可能原因。

这都是品味问题。Java 不允许运算符重载,原因与您给出的原因类似。有些人喜欢阅读单词,有些人喜欢看到符号表示。