IDesign 编码标准声明“不提供公共(public)事件成员变量。改用事件访问器。”
我很欣赏事件访问器在某些情况下很有用(我认为 Control
使用字典来仅存储分配的事件以节省内存)。但强制此样板代码始终存在的意义何在?
编辑:明确
public event EventHandler EventName;
对比
public event EventHandler EventName { add { ... } remove { ... } }
[参见 IDesign Coding Standard - 编码标准 - 42]
最佳答案
委托(delegate)字段不是事件 - 它们只是委托(delegate)字段。它们可以(非常不正确地)被外部调用者检查、清空和调用,这与事件的设计(通常只能由声明类处理)相反。
封装允许间接、验证等;一切都令人向往。而且成本极低。这会影响代码的性能是不正常的。
它还允许它们在接口(interface)上使用;不能在接口(interface)上声明字段。
编辑:
问题有点不清楚,但如果问题只是类似字段的事件与使用委托(delegate)支持者的显式添加/删除……那是愚蠢的。不要添加不必要的代码。类似字段的事件将是首选,除非有足够的事件来保证 EventHandlerList 的实现。
特别是,4.0 编译器现在非常明智地实现了线程安全(历史上并非如此)。
关于C# 标准 : rationale for "Do not provide public event member variables"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5583159/