EventArgs 在事件模式中作为基础 class 的目的是什么?
What's the purpose of EventArgs as base class in the event pattern?
classic 通用 C# 事件具有这些参数:
(object sender, EventArgs e)
我可以为 e
参数实现一个具有更具体签名的事件,派生 EventArgs
。
现在,像 EventArgs
这样的基数 class 的目的是什么?我的意思是……它是空的。没有 base/abstract/virtual 属性、字段或其他内容。
为什么基本事件的参数不是下面这样?
(object sender, object eventArgs)
也就是说,为什么所有具有某些已实现和特定事件参数参数的事件都是从 EventArgs
而不是从简单的 object
派生的?
上面的问题与下面的问题相似。通用形式的事件委托是:
delegate void EventHandler<TEventArgs>(object sender, TEventArgs e)
并且对参数e
没有任何限制。但我希望像 where TEventArgs : EventArgs
这样的东西是连贯的...
Object 不会排除 int、double 等值类型。它们会引入 boxing and un-boxing issues。选择在对象上使用基础 class 是强制在整个 API 中传递强类型对象的选择。
当我看到 object type as it kind of defeats the whole point of using a strongly typed programming language, you might as well go program in javascript, although anyone remotely familiar with javascript will know they are striving towards a strongly typed programming paradigm 的普遍使用时,我往往会畏缩。
编辑: 进一步详细说明通过 reference types vs value types 的事件模型之间的区别。当处理事件的委托更改事件的数据时(许多人在引发事件时经常这样做),如果传递的数据是值类型,则您需要开始考虑是否要更改按值传递的副本或对值类型的原始引用,当然你会希望你正在改变原始的。强制传递引用类型是 .NET 事件模型中一个非常关键的设计决策。
classic 通用 C# 事件具有这些参数:
(object sender, EventArgs e)
我可以为 e
参数实现一个具有更具体签名的事件,派生 EventArgs
。
现在,像 EventArgs
这样的基数 class 的目的是什么?我的意思是……它是空的。没有 base/abstract/virtual 属性、字段或其他内容。
为什么基本事件的参数不是下面这样?
(object sender, object eventArgs)
也就是说,为什么所有具有某些已实现和特定事件参数参数的事件都是从 EventArgs
而不是从简单的 object
派生的?
上面的问题与下面的问题相似。通用形式的事件委托是:
delegate void EventHandler<TEventArgs>(object sender, TEventArgs e)
并且对参数e
没有任何限制。但我希望像 where TEventArgs : EventArgs
这样的东西是连贯的...
Object 不会排除 int、double 等值类型。它们会引入 boxing and un-boxing issues。选择在对象上使用基础 class 是强制在整个 API 中传递强类型对象的选择。
当我看到 object type as it kind of defeats the whole point of using a strongly typed programming language, you might as well go program in javascript, although anyone remotely familiar with javascript will know they are striving towards a strongly typed programming paradigm 的普遍使用时,我往往会畏缩。
编辑: 进一步详细说明通过 reference types vs value types 的事件模型之间的区别。当处理事件的委托更改事件的数据时(许多人在引发事件时经常这样做),如果传递的数据是值类型,则您需要开始考虑是否要更改按值传递的副本或对值类型的原始引用,当然你会希望你正在改变原始的。强制传递引用类型是 .NET 事件模型中一个非常关键的设计决策。