C#'event'关键字的多重含义?

Mic*_*eld 12 c# events keyword

我最近在Eric Lippert的一篇非常棒的博客上重新阅读了一些旧帖子,并发现了这个小故事:

C#的相当一部分关键字以两种或多种方式使用:fixed,into,partial,out,in,new,delegate,where,using,class,struct,true,false,base,this,event,return和无效都有至少两种不同的含义.

为了好玩,我的同事和我自己进行了测验,除了其中一个关键字之外,我能够提供至少两种用途.困扰我的那个是event.

显然,event在声明委托类型的成员字段时使用将其转换为事件(例如,仅公开添加/删除操作符).事件的另一个含义是什么?

编辑(答案):

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

在省略事件访问器的事件声明上指定的属性可以应用于正在声明的事件,关联字段(如果事件不是抽象),或者应用于关联的添加和删除方法.在缺少attribute-target-specifier的情况下,该属性适用于该事件.所述的存在event 属性目标说明符指示该属性适用于该事件; 所述的存在field 属性目标说明符指示该属性适用于该字段; 并且 method attribute-target-specifier的存在表明该属性适用于方法.

Han*_*ant 6

作为属性目标说明符.我想不出你会这么做的一个好理由:

[AttributeUsage(AttributeTargets.Event)]
class MyAttribute : Attribute { }

class foo {
    [event: MyAttribute]
    public event EventHandler goo;
}
Run Code Online (Sandbox Code Playgroud)


Hen*_*man 5

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

public event MyDelegate MyEvent;

public event MyDelegate MyEvent
{
    add { ... }
    remove { ... }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,这就是我想知道的区别(见评论) - 类似字段的事件与事件API.看起来......虽然很脆弱,IMO. (2认同)