最近频繁的接触到泛型方面的问题,所以也不得不来学习一下了,开始主要是在MSDN的WebCast上去下载教学录象看的(李建忠老师的),本篇文章先介绍一下泛型入门方面的知识,希望能让刚开始学习泛型的朋友能够更快的入门,言归正传,首先我们来看一下泛型的基本概念:
最显著的一点就是它参数化了类型,把类型作为参数抽象出来,从而使我们在实际的运用当中能够更好的实现代码的重复利用,同时它提供了更强的类型安全,更高的效率,不过在约束方面,它只支持显示的约束,这样在灵活性方面就显得不是那么好了.我觉得它之所以能够提供更高的效率是因为泛型在实例化的时候采用了"on-demand"的模式,即按需实例化,发生在JIT(Just In Time)编译时.
下面来看如何定义一个泛型类,很简单,你只需要意识到一点,在这里,类型已经被参数化了:
using System; using System.Collections.Generic; using System.Text; namespace GenericTest { class Program { staticvoid Main(string[] args) { //使用string,int来实例化Test<T,S>类 Test<string, int> t =new Test<string, int>("SHY520",22); //调用泛型类中的方法 t.SetValue(); } } /**////<summary> /// 定义一个泛型类,该类有两个类型参数,分别是T,S ///http://pw.cnblogs.com ///</summary> ///<typeparam name="T">类型参数</typeparam> ///<typeparam name="S">类型参数</typeparam> publicclass Test<T,S> { //泛型类的类型参数可用于类成员 private T name; private S age; public Test(T Name,S Age) { this.name = Name; this.age = Age; } publicvoid SetValue() { Console.WriteLine(name.ToString()); Console.WriteLine(age.ToString()); } } }
class A { publicvoid F1() {} } class B { publicvoid F2() {} } class C<S,T> where S: A // S继承自A where T: B // T继承自B { // 可以在类型为S的变量上调用F1, // 可以在类型为T的变量上调用F2 }
2、接口约束
interface IPrintable { void Print(); } interface IComparable<T>{ int CompareTo(T v);} interface IKeyProvider<T>{ T GetKey(); } class Dictionary<K,V> where K: IComparable<K> where V: IPrintable, IKeyProvider<K> { // 可以在类型为K的变量上调用CompareTo, // 可以在类型为V的变量上调用Print和GetKey }
3、构造器约束
class A { public A() { } } class B { public B(int i) { } } class C<T> where T : new() { //可以在其中使用T t=new T(); } C<A> c=new C<A>(); //可以,A有无参构造器 C<B> c=new C<B>(); //错误,B没有无参构造器
4、值/引用类型约束
publicstruct A { } publicclass B { } class C<T> where T : struct { // T在这里面是一个值类型 } C<A> c=new C<A>(); //可以,A是一个值类型 C<B> c=new C<B>(); //错误,B是一个引用类型