事件参数; "发件人为对象",或"发件人为T"?

bre*_*dog 13 .net c# vb.net oop events

当我为业务对象编写公共事件时,除了附加的特定参数之外,我还习惯于将实例作为" sender as Object " 传递.我现在问自己为什么不指定课程

所以对你有更多的经验; 您是否曾在活动中将不同的类作为发件人传递?如果是这样,那么当你可以/不好的时候,你的决定标准是什么?

Che*_*hen 11

不要太极端.EventHandler(object sender, EventArgs e)有一个对象发送者,以便我们可以在许多情况下使用它.但这并不意味着一个强类型的发送者是邪恶的.当这个委托不被广泛使用时(例如EventHandler),强类型发送者很有用

public delegate void SaveHandler(Controller sender, EventArgs e);
Run Code Online (Sandbox Code Playgroud)

现在,其他开发人员(或使用您的库的人)可以识别发件人必须是a Controller,并且他们很乐意不这样编码:

public void MySaveHandler(object sender, EventArgs arg)
{
   var controller = sender as Controller;
   if (controller != null)
   {
       //do something
   }
   else
   {
       //throw an exception at runtime? 
       //It can be avoided if sender is strongly-typed
   }
}
Run Code Online (Sandbox Code Playgroud)

你甚至可以把它变成通用的:

public delegate void SaveHandler<T>(T sender, EventArgs args) 
                                              where T: IController;
Run Code Online (Sandbox Code Playgroud)

这是C#的纯法律和良好实践.你应该明确你想做什么,然后选择更好的方法.他们中的任何一个都是邪恶的.


Han*_*ing 5

有一个设计指南,指定事件处理程序应该有两个参数:sender(一个Object)和e(EventArgs或从中派生).

  • @Lasse:实际上,我怀疑他们选择这个的原因是否有效(或至少“足够好”),除了 .NET 的第一个版本中没有泛型。 (2认同)