C# 中事件的正常实现和显式实现有什么区别?
本文关键字:实现 什么 区别 事件 常实现 | 更新日期: 2023-09-27 18:36:37
这是一个正常的实现:
public event MyDelegate MyEvent;
这是显式实现:
private MyDelegate eventStorage
public event MyDelegate MyEvent
{
add
{
eventStorage += value;
}
remove
{
eventStorage -= value;
}
}
那么,哪种实现更合适,在哪些情况下我应该使用每种实现?感谢您的建议
这两个示例是等效的 - 编译器在编译第一个版本时将生成第二个版本(或类似版本)。
这只是句法糖 - 使用你更舒服的糖。
您可以将其视为类似于编译器对自动实现的属性执行的操作,只是相反。
只有当自动实现不适合你时,你才应该使用 exlicit。
例如,WinForms 事件使用显式实现来减少类上的委托字段数(每个事件生成一个),如果没有人订阅特定事件,则这些字段毫无用处,为某人订阅的每个事件保留一个委托字典。这只是这可能有用的一种情况。
您还可以在订阅/删除事件期间记录或应用安全检查。
Normal将简单地编译成与显式实现非常相似的东西,如果它所做的只是订阅。手动实施的好处是,当有人订阅或取消订阅事件时,您有机会执行某些操作。
MSDN 文档演示了示例 2 中的示例用法。
就我个人而言,我从来不需要在日常活动中手动分解事件。因此,对于绝大多数情况,如果您认为表达相同事物所需的代码更少,则正常方式是"更合适"。
一旦你想做一些像例子中这样的事情,那么不仅明确地"更合适"地做它实际上是必需的。