c# - 事件参数; "sender as Object"或 "sender as T"?

标签 c# .net vb.net oop events

当我为我的业务对象编写公共(public)事件时,除了额外的特定参数外,我已经习惯了始终将实例作为“发送者作为对象”传递。我现在只是问自己为什么我不指定类

所以对于有更多经验的你; 您是否曾经在事件中作为发件人传递不同的类别?如果是这样,您的决策标准是什么时候可以/不可以?

最佳答案

不要太极端。 EventHandler(object sender, EventArgs e) 有一个对象发送器,所以我们可以在很多情况下使用它。但这并不意味着强类型发件人是邪恶的。当此委托(delegate)不会被广泛使用(如 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# 中这是纯粹的合法和良好实践。你应该明确你想做什么,然后选择更好的方法。他们中的任何一个都是邪恶的/坏的。

关于c# - 事件参数; "sender as Object"或 "sender as T"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4944633/

相关文章:

c# - 按计算值排序列表

c# - 如何使用 "current"值绑定(bind)到 WPF 中的枚举

c# - Inno Setup .NET DLL 调用在 64 位中有效,在 32 位中失败

Javascript 作用域与 asp.net

vb.net - 如何在VB.NET中将Date变量设置为null

c# - 需要有关代码 c# 的帮助

c# - 迭代从 JSON 文件生成的动态对象的问题

.Net 3.5 Windows 窗体应用程序 : x86 vs x64 load times on 64 bit Vista

c# - Excel 互操作加载 XLL 和 DLL

mysql - 将 MySQL 连接字符串动态更改为 Crystal Reports