开放类型和闭合类型
.NET把带有类型参数的类型看做一个新的类型,CLR将为这些类型创建内部类型对象,带有类型参数的类型可以是类,结构,接口和委托。但是,一个带有类型参数的类型称为开放类型,CLR不允许开放类型实例化(就好比不允许接口实例化一样)。
当代码中引用了泛型类型,代码里可以指定一组泛型类型参数。如果传入实际的数据类型,那么这个类型就成为闭合类型,CLR允许实例化闭合类型。然而,也有可能代码引用了泛型类型,但未指定泛型类型参数,这就在CLR中创建了一个新的开放类型,这种类型无法实例化,看一个例子。
- internal sealed class DictionaryStringKey<TValue> :Dictionary<String, TValue>
- {
- }
- static void Main(string[] args)
- {
- Object o = null;
-
- Type t = typeof(Dictionary<,>);
-
- o = CreateInstance(t);
- Console.WriteLine();
-
- t = typeof(DictionaryStringKey<>);
-
- o = CreateInstance(t);
- Console.WriteLine();
-
- t = typeof(DictionaryStringKey<Guid>);
-
- o = CreateInstance(t);
-
- Console.WriteLine("Object type=" + o.GetType());
- }
- private static Object CreateInstance(Type t)
- {
- Object o = null;
- try
- {
-
- o = Activator.CreateInstance(t);
- Console.Write("Created instance of {0}", t.ToString());
- }
- catch (ArgumentException e)
- {
- Console.WriteLine(e.Message);
- }
- return o;
- }
|
运行结果:
Activator.CreateInstance创建实例的时候,会提示你该类型包含泛型参数。
输出中,可以看到类型名称后跟着反引号(`)以及一个数字。这个数字即类型中的类型参数的数量。比如泛型Dictionary类是2,因为它需要2个类型参数来指示TKey和TValue。DictionaryStringKey类只有1个因为它只需要指明1个类型TValue。
.NET中的类型
.net中,除了实例构造器,CLR也支持类型构造器(也称作静态够器,类够在其或者类型初始化器)。类型构造器可以应用于接口(c#中不支持),引用类型(class)和值类型(struct),和实例构造器初始化类型的实例一样,类型构造器用来初始化类型的一些状态,类型的构造器如果有的话 只可能有1个,并且是无参的。