具有(object,EventArgs)参数的事件回调是否是1.1和WinForms的保留?

时间:2008-12-13 15:50:23

标签: .net architecture coding-style callback

所以我最近开始玩FxCop而且我注意到的一件事是它坚持任何附加到事件的方法应该是以

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

并附上

MyObject.Event += new EventHandler(Callback);

现在,在.Net 1.1天里,这一切都很好,但从3.5开始,我发现只需要进行Action类型或其中一个泛型的事件调用就更容易,更直观,并编写方法正如我明确要求的那样;没有那个对象发送者或EventHandler残忍。

作为一个问题,我认为这是一个平坦的设计要求。如果你为一个事件回调设计一个不同的方法,这意味着该方法至少隐含地有一些关于它的调用的信息 - 这是一个主要的禁忌!

我完全愿意接受我可能会遗漏某些东西。你们对此有什么想法,FxCop是错误的还是我?

2 个答案:

答案 0 :(得分:1)

你应该遵循惯例。

  1. 使用通用的EventHandler< T>,其中T是或来自EventArgs。用

    连接事件

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

  2. 事件处理程序方法应返回void(无意义地将某些内容返回给事件提升者),并且应遵循使用事件args中的数据获取sender对象的约定。

  3. “废话”的原因(发件人和eventargs)

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

    模式继续发展。您还应该在名为OnSomeEvent()的受保护方法中引发事件“SomeEvent”,以便类的派生可以执行诸如抑制事件,以线程安全方式引发它们,在UI线程上引发它们,通过超时引发它们之类的事情。或异常保护,日志事件提升过程等。

    嘿,这不是一个完美的模式(也许发送者可能被放入事件args)但几乎所有.Net代码都遵循它,框架代码总是遵循它。为什么不跟随。

答案 1 :(得分:0)

我认为FxCop在很长一段时间内都没有更新;你有没有尝试使用VS2008代码分析工具(FxCop的继任者)?