C# 中事件的正常实现和显式实现有什么区别?

本文关键字:实现 什么 区别 事件 常实现 | 更新日期: 2023-09-27 18:36:37

这是一个正常的实现:

public event MyDelegate MyEvent; 

这是显式实现:

private MyDelegate eventStorage
public event MyDelegate MyEvent
{
  add
  {
     eventStorage += value;
  }
  remove
  {
     eventStorage -= value;
  }
}

那么,哪种实现更合适,在哪些情况下我应该使用每种实现?感谢您的建议

C# 中事件的正常实现和显式实现有什么区别?

这两个示例是等效的 - 编译器在编译第一个版本时将生成第二个版本(或类似版本)。

这只是句法糖 - 使用你更舒服的糖。

您可以将其视为类似于编译器对自动实现的属性执行的操作,只是相反。

只有当自动实现不适合你时,你才应该使用 exlicit。

例如,WinForms 事件使用显式实现来减少类上的委托字段数(每个事件生成一个),如果没有人订阅特定事件,则这些字段毫无用处,为某人订阅的每个事件保留一个委托字典。这只是这可能有用的一种情况。

您还可以在订阅/删除事件期间记录或应用安全检查。

Normal将简单地编译成与显式实现非常相似的东西,如果它所做的只是订阅。手动实施的好处是,当有人订阅或取消订阅事件时,您有机会执行某些操作。

MSDN 文档演示了示例 2 中的示例用法。

就我个人而言,我从来不需要在日常活动中手动分解事件。因此,对于绝大多数情况,如果您认为表达相同事物所需的代码更少,则正常方式是"更合适"。

一旦你想做一些像例子中这样的事情,那么不仅明确地"更合适"地做它实际上是必需的。