C# 标准 : rationale for "Do not provide public event member variables"?

标签 c# coding-style

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/

相关文章:

c - 在任何情况下直接返回结构都是好的做法吗?

c# - 如何使用XmlReader以int形式获取属性值?

c# - 对 Flickr API 的签名请求签名无效(在控制台中模拟)

c# - ODATA WebService,获取$元数据 C#

c# - 当只调用一次时,创建辅助方法是否仍然有意义?

c++ - 枚举到数组绑定(bind)

Intellij Idea/Android Studio 中的 Android 代码风格

javascript - x >= JavaScript 中的 x 模式

c# - 使用反射将 IDbSet<T> 的属性复制到另一个同名的 List<T> 类的属性?

c# - 如何只隐藏关闭(x)按钮?