2

所以我最近开始玩 FxCop,我注意到的一件事是它坚持认为附加到事件的任何方法都应该采用以下形式

void Callback(object sender, EventArgs args) { ...}

并附上

MyObject.Event += new EventHandler(Callback);

现在在.Net 1.1 的日子里一切都很好,但从 3.5 开始,我发现只进行 Action 类型的事件调用或其泛型之一,并完全按照我的方式编写方法变得更加容易和直观如果它被显式调用;没有那个对象发送者或EventHandler cruft。

作为一个问题,我认为这是一个平面设计的必要性。如果您为事件回调设计了不同的方法,这意味着该方法至少隐含了一些关于其调用的信息——这是一个主要的禁忌!

我完全愿意接受我可能会遗漏一些东西。你们对此有何看法,FxCop 错了还是我错了?

4

2 回答 2

1

你应该遵守约定。

  1. 使用通用 EventHandler<T>,其中 T 是 EventArgs 或派生自 EventArgs。与活动挂钩

    MyObject.SomeEvent += new EventHandler<EventArgs>(SomeMethod);

  2. 事件处理程序方法应该返回 void(向事件引发者返回一些东西是没有意义的),并且应该遵循在事件 args 中获取带有数据的发送者对象的约定。

“废话”的原因(发送者和事件参数)

  • 习俗
  • 可扩展性更容易实现(引发事件的类和处理它的类)
  • 有时您想知道是谁发送了事件。
  • 任何/所有数据都可以封装在事件参数中。
  • 您可以对许多事件使用相同的事件处理程序。

该模式进一步延续。您还应该在名为 OnSomeEvent() 的受保护方法中引发事件“SomeEvent”,以便类的派生者可以执行诸如抑制事件之类的操作,以线程安全的方式引发它们,在 UI 线程上引发它们,通过超时引发它们或异常保护,记录事件引发过程等。

嘿,这不是一个完美的模式(也许发件人可能已经被放入事件参数中)但几乎所有的 .Net 代码都遵循它,并且框架代码总是遵循它。为什么不也跟着。

于 2008-12-13T18:56:48.817 回答
0

我认为 FxCop 已经很久没有更新了。您是否使用 VS2008 代码分析工具(FxCop 的继任者)尝试过?

于 2008-12-13T17:43:32.193 回答