【问题标题】:Multiple meanings of the C# 'event' keyword?C#“事件”关键字的多重含义?
【发布时间】:2011-07-12 20:50:59
【问题描述】:

我最近在重读 Eric Lippert 的 ridiculously awesome 博客上的一些旧帖子时遇到了 this tidbit

C# 的相当一部分关键字用于两个或多个 方式:固定,进入,部分,出,入,新,委托,在哪里,使用, class、struct、true、false、base、this、event、return 和 void all 至少有两种不同的含义。

只是为了好玩,我和我的同事对自己进行了测验,除了其中一个关键字之外,我能够提出至少两种用途。难倒我的是event

显然,在声明委托类型的成员字段时使用 event 会将其转换为事件(例如,仅公开添加/删除运算符)。事件的其他是什么意思?

编辑(答案):

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

在省略事件的事件声明中指定的属性 访问器可以应用于被声明的事件,关联的 字段(如果事件不是抽象的),或关联的添加和 删除方法。在没有 attribute-target-specifier 的情况下, 属性适用于事件。 event的存在 attribute-target-specifier 表示该属性适用于 事件; field attribute-target-specifier 的存在表明 该属性适用于该字段;和存在的 method attribute-target-specifier 表示该属性适用 到方法。

【问题讨论】:

  • 请链接到确切的文章,而不是整个博客。
  • 任何代表委托的函数都被认为是一个事件。例如,按钮单击是一个事件。您还可以有一个自定义事件。像用户/自定义控件有一个自定义事件
  • @George:这是一个关于编程语言中的关键字的问题。对我来说听起来很切题。 @Henk Holterman:完成。
  • "member field" - 好吧,从技术上讲,它不是一个字段...它是一个event ;p 类字段事件(包括实现)和事件(仅 API 签名)计数?
  • 在不安全的代码中,void * 是一个“无类型”指针,而方法上的“void”关键字意味着没有返回值。

标签: c# events keyword


【解决方案1】:

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

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

class foo {
    [event: MyAttribute]
    public event EventHandler goo;
}

【讨论】:

  • 有趣。这会需要吗?我可以理解[assembly: ...],但不是他的。
  • 哇。我不知道这甚至是一种选择。 “事件”似乎是唯一在其他地方也是语言关键字的属性目标,所以我想就是这样。
  • 如果没有给出说明符,则事件目标说明符似乎是默认值,因此显然从不需要;如果您有多个属性针对事件的不同部分,我想您可能希望使用它来清楚地说明。
  • 哎呀。 100% 的冗余使用;p 很好的记忆力将其挖掘出来(或者您在规范中单击“下一步”、“下一步”……?;p)
  • 我希望我能记住整个规范!一旦@Hans 找到了用法,我就去规范的属性部分搜索事件。只是在那个部分出现了几次。
【解决方案2】:

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

public event MyDelegate MyEvent;

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

【讨论】:

  • 是的,这就是我想知道的区别(参见 cmets) - 类字段事件与事件 API。似乎......不过,IMO 很脆弱。
  • 我很确定这是正确的。来自帖子:“显然,我们经常使用相同的关键字在概念上表示相同的事物。”我认为event 就是其中之一。
  • @Marc:我认为它更像是一种“类似字段的表示法”。两种情况下的实际结果都是带有 add&remove 的事件。汽车属性是否符合不同类型的属性?
  • 这是我能得出的最接近“第二个含义”的意思,但似乎该关键字在同一上下文中用于同一目的:声明事件类型的类成员。我不会考虑“得到”;和 "get { return foo; }" "get" 关键字的两种不同用法...?
  • @Henk 在规范中,它们被明确称为“类场事件”。我按照术语使用它。
【解决方案3】:

来自MSDN,事件的两种使用方式是:

[attributes] [modifiers] event type declarator;

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

【讨论】:

  • 在“多重含义”关键字列表中的所有其他情况下,关键字的使用方式有两种不同的方式。即使含义密切相关,上下文也不同——使用 base.Method() 调用方法与使用 ":base()" 调用构造函数。我期望事件的“其他”使用会比访问器声明的存在或不存在更明显。
猜你喜欢
  • 2013-08-25
  • 2011-04-16
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多