我在某处读到EventHandler是一个内置泛型类型。为什么会这样?有人可以解释一下区分泛型和非泛型类型的方法吗?
谢谢, ABHI。
=====
我正在阅读Microsoft .NET Framework应用程序开发基础第2版以准备MCTS。在第一章中,有一个问题如下: -
以下哪项是内置通用类型的示例? (选择所有 应用。) A. Nullable B.布尔 C. EventHandler D. System.Drawing.Point
问题的答案是按照书中的A和C.选项A没问题,但对选项C不确定。有人可以解释一下吗?
答案 0 :(得分:2)
有两种类型:EventHandler
和EventHandler<TEventArgs>
。显然第一个不是通用的,第二个是。
答案 1 :(得分:0)
T是eventhanlder处理的EventArgs的类型(所以T : EventArgs
)
答案 2 :(得分:0)
在C#中(但它也适用于Java),您可以通过类型参数的存在来识别泛型,通常在<>
括号之间指示。
例如,C#中的泛型类型的EventHandler声明为:
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
参数化委托的类型TEventArgs
用于在事件处理函数内部进行静态类型,而不需要强制转换或为需要传递给处理程序的每种类型的参数定义多个委托类型。 / p>
假设您有2个不同的事件,一个生成T1
类型的对象,一个类型为T2
。
您将拥有两个不同的处理程序:
void HandleEvent1(object sender, T1 args) {...}
void HandleEvent2(object sender, T2 args) {...}
在C#1.0(没有泛型)中,您将为2个事件创建自己的委托类型:
delegate void Event1Handler(object sender, T1 e);
delegate void Event2Handler(object sender, T2 e);
并使用它们将事件与处理程序绑定。
从C#2.0开始,不需要创建新的委托类型,因为两个处理程序都是通用的EventHandler<>
类型(TEventArgs
= T1
或TEventArgs
= {{ 1}})。
答案 3 :(得分:0)
要回答这个问题,您最终需要在MSDN索引中查找每个类型名称。 Nullable显示为Nullable<T>
。 EventHandler
显示两次,带有和不带<T>
后缀。这些实际上是单独的类型。
答案 4 :(得分:0)
这个问题措辞严厉,但要问的是哪些类型是通用的(或者是通用版本)。答案是EventHandler
和Nullable
,因为Boolean
和Point
没有通用的等价物。