繁体   English   中英

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

[英]Event parameter; “sender as Object”, or “sender as T”?

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

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

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

public delegate void SaveHandler(Controller sender, EventArgs e);

现在,其他开发人员(或使用你的库的人)可以认识到发件人必须是一个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
   }
}

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

public delegate void SaveHandler<T>(T sender, EventArgs args) 
                                              where T: IController;

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

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

没有这样的限制。 它只是整个BCL(基类库)和其他流行框架遵循的指导原则。

如果它将被其他开发人员使用或作为框架发布,我建议您遵循它以保持一致。

据我看到它,你可以创建你想要的参数代表,然后创建一个使用该委托的事件,然后你可以调用事件和传递的参数,也可以使用自定义事件参数如图所示这里 正如另一个答案所示。 保持一致。

没有真正回答您关于决策标准的问题,但希望它有所帮助

我目前的理念是尽可能使代码实践尽可能接近标准的Microsoft方式。 你从这里得到两件事:

  • 新开发人员可以快速了解您的代码
  • 您培训现有开发人员如何使用框架的其余部分

最好使用object sender, EventArgs e签名,因为该方法可以处理该签名的任何事件。 例如,在使用图表控件的项目中,有几种类型的MouseOver事件 - 来自DataSeries ,来自Legend,来自整个Canvas。

这样,您可以处理事件的任何来源,因为在大多数情况下,信息都在EventArgs

此外,您不必在将代理传递给委托时强制转发,因为任何类实例都是内部对象。

不久前在StackOverflow上就相关问题进行了大量讨论。 这是一个问题: .NET中的事件签名 - 使用强类型发件人

最终,它归结为偏好。 在大多数情况下,您希望将事件处理程序绑定到特定类型的类,这样使发件人成为一个对象,然后回滚到该类以便访问其属性可能不会很好地与您[它也不适合我。

此外,使用.NET 3+以及委托协方差和逆变的引入,使用强类型委托应该不是问题。 我必须承认,我在代码中多次使用强类型事件处理程序。

就像我之前说的那样,它取决于偏好; 微软刚刚发布了一套引导线而非规则......

拥有这样的实现对你没有约束力。 它通常是因为EventHandler 委托设计了这样的原型。

它是一个简单的指南,后面是基类库。 但是你可以确保自己拥有参数和实现。

但请记住,如果某些开发人员使用它,他将需要了解此类实现。 无论在哪个级别使用,它都能提供更好的灵活性和灵活性。

如果您为事件定义自定义原型 ,那么我建议您还定义自定义委托 ,以确保如果未传递正确的类型,您将捕获异常 (如果需要,用户需要进行显式演员)

像这样:

public delegate void MyEventHandler( MyType sender, EventArgs e);

然后在需要时使用它:

this.MyEvent += new MyEventHandler(my_eventhandlerfunction);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM