c# '事件'关键字

本文关键字:关键字 事件 | 更新日期: 2023-09-27 18:02:32

我最近重读了Eric Lippert博客上的一些旧文章,发现了这个花絮:

c#中相当大一部分关键字被用于两个或两个以上方式:fixed, into, partial, out, in, new, delegate, where, using,Class, struct, true, false, base, this, event, return and void all至少有两种不同的含义

只是为了好玩,我的同事和我自己做了个测试,我能够想出除了一个关键词之外的所有关键词的至少两种用法。让我难倒的是event

显然,在声明委托类型的成员字段时使用event将其转换为事件(例如,仅暴露add/remove操作符)。事件的其他含义是什么?

编辑(回答):

感谢@Hans Passant,我从c#规范中挖掘出了这一点,它解释了事件的另一种用途——作为事件属性的(默认)属性目标说明符(来自第17.2节):

在事件声明中指定的省略事件的属性访问器可以应用于正在声明的事件,也可以应用于关联的字段(如果事件不是抽象的),或关联的add和删除的方法。如果没有属性-目标-说明符,则属性应用于该事件。event的存在attribute-target-specifier表示该属性应用于事件;存在field 属性-目标-指定符表示属性应用于字段;和存在的method attribute-target-specifier表示应用该属性

c# '事件'关键字

作为属性目标说明符。我想不出你这样做的好理由:

[AttributeUsage(AttributeTargets.Event)]
class MyAttribute : Attribute { }
class foo {
    [event: MyAttribute]
    public event EventHandler goo;
}

有两种方法使用 event,但我不确定这是否合格。

public event MyDelegate MyEvent;
public event MyDelegate MyEvent
{
    add { ... }
    remove { ... }
}

从MSDN中,使用事件的两种方法是:

[attributes] [modifiers] event type declarator;

[attributes] [modifiers] event type member-name {accessor-declarations};