GetType()
方法可于程序运行时得知泛型及其类型参数的实际类型,更可以运用反射编程。 2. 为什么需要泛型任何API只要将object作为参数类型或返回类型使用,就可能在某个时候涉及强制类型转换。设计只有一个类,并将object作为根的层次结构,将使一切变得更加简单。但是,object类型本身是极其‘愚钝’的一个存在。要用一个object做真正有意义的事情,几乎都要对它进行强制类型转换。泛型能对性能有增强的作用,首先编译器能执行更多的检查,所以执行时的检查可以少做。其次,JIT能够聪明地处理值类型,能消除很多情况下的装箱和拆箱处理。某些情况下,无论在速度上还是在内存消耗上,有泛型和没有泛型的结果会大相径庭。泛型带来的好处非常像静态语言较之动态语言的优点:更好的编译时检查,更多在代码中能直接表现的信息,更多的IDE支持,更好的性能。原因很简单,使用一个不能区分不同类型的常规API(比如ArrayList),相当于在一个动态环境中访问那个API。顺便说一下,反过来说通常不成立:动态语言在许多情况下都具备大量的优势,但这些情况很少适用于选择泛型和非泛型的API。当你能合理地使用泛型时,通常会毫不犹豫地选择泛型。 3. 我们通过例子来学习1)我们用泛型来创建一个创建List的方法:public List<T> MakeList<T>(T a, T b) { return new List<T>() {a, b}; }
List<string> myList = MakeList("str1", "str2");
从上面的例子可以看出,只要我们传入自己的类型,就能创造返回自己的类型了。2)现在我们深入一点。就像实例字段从属于一个实例一样,静态字段从属于声明他们的类型。如果在SomeClass中声明了静态字段x,不管创建SomeClass的多少个实例,也不管从SomeClass派生出多少个类型,都只有一个SomeClass.x字段。每个封闭类型都有它自己的静态字段集。我们为不同的封闭类型设置字段的值,然后打印这些值,证明它们是各自独立的。public class TypeWithField<T> { public static string field; public static void PrintField() { Console.WriteLine(field +": " + typeof(T).Name); } }下面我们打印它们的值:
TypeWithField<int>.field = "f1"; TypeWithField<string>.field = "s2"; TypeWithField<DateTime>.field = "t3"; TypeWithField<int>.PrintField(); TypeWithField<string>.PrintField(); TypeWithField<DateTime>.PrintField();可以看到有这些值:
