gpt4 book ai didi

c# - EventArgs 作为事件模式中的基类的目的是什么?

转载 作者:太空狗 更新时间:2023-10-29 20:23:02 31 4
gpt4 key购买 nike

经典的通用 C# 事件具有以下参数:

(object sender, EventArgs e)

我可以为 e 参数实现一个具有更具体签名的事件,为 EventArgs 派生。

现在,像 EventArgs 这样的基类的目的是什么?我的意思是……它是空的。没有基本/抽象/虚拟属性,也没有字段或其他东西。

为什么一个基本事件的参数不是像下面这样?

(object sender, object eventArgs)

也就是说,为什么所有具有某些已实现和特定事件参数参数的事件都从 EventArgs 而不是从简单的 object 派生出来?

上面的问题与下面的问题相映生辉。通用形式的事件委托(delegate)是:

delegate void EventHandler<TEventArgs>(object sender, TEventArgs e)

并且对参数e没有任何限制。但我希望像 where TEventArgs : EventArgs 这样的东西是连贯的......

最佳答案

对象不会排除像 int、double 等值类型。这会引入 boxing and un-boxing issues .选择使用基类而不是对象是强制在整个 API 中传递强类型对象的选择。

当我看到 object type 的普遍使用时,我往往会畏缩因为它有点破坏了使用强类型编程语言的全部意义,所以您不妨使用 javascript 进行编程,尽管任何熟悉 javascript 的人都会知道他们正在努力实现 strongly typed programming paradigm。 .

编辑:进一步阐述事件模型传递 reference types vs value types 的区别。 .当处理事件的委托(delegate)更改事件的数据时,许多人在引发事件时经常这样做,如果传递的数据是值类型,则您需要开始考虑是否要更改按值传递的副本或对值类型的原始引用,当然你会希望你正在改变原始的。强制传递引用类型是 .NET 事件模型中一个非常关键的设计决策。

关于c# - EventArgs 作为事件模式中的基类的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44012280/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com