![](/img/trans.png)
[英]In a C# event handler, why must the “sender” parameter be an object?
[英]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.