泛型
一、泛型体验
泛型是framework 2.0加入的一种特殊的算法重用机制,允许程序员在代码中将变量的类型先用类型占位符来替代,等到运行的时候在根据传入的类来替换。
Demo1
MyList类:
1 public class MyList<T> 2 { 3 T[] arr; 4 public int count=0; 5 public MyList(int length) 6 { 7 arr = new T[length]; 8 } 9 public void Add(T t)10 {11 arr[count] = t;12 count++;13 }14 15 /// <summary>16 /// 索引器17 /// </summary>18 /// <param name="index"></param>19 /// <returns></returns>20 public T this[int index]21 {22 get23 {24 if (index >= arr.Length)25 {26 throw new System.Exception("数组下标越界");27 }28 else29 {30 return arr[index];31 }32 }33 set34 {35 if (index >= arr.Length)36 {37 throw new System.Exception("数组下标越界");38 }39 else40 {41 arr[index]=value;42 }43 }44 }45 }View Code
调用:
1 PRotected void Page_Load(object sender, EventArgs e) 2 { 3 MyList<int> list = new MyList<int>(4); 4 5 list.Add(1); 6 list.Add(4); 7 list.Add(5); 8 list.Add(6); 9 for (int i = 0; i < list.count; i++)10 {11 Response.Write(list[i].ToString());12 }13 }View Code
注意:
1、 是在运行时,将堆空间里的对象内部所有的占位符都替换成传入的类型.
2、 泛型是指带类型参数的类,而不是类型参数本身。
如:public class MyList<T>{..} 其实MyList就是泛型,而T是类型参数。
3、 clr编译时,编译器只为MyList<T>类型产生“泛型版”的IL代码------并不进行泛型的实例化,T在中间只充当占位符。
4、 执行的时候,当jit编译器第一次遇到MyList<int>时,将用int替代”泛型版”IL代码与源数据中的T------进行泛型类型的实例化。
5、 实例化一个引用类型的泛型,它在内存中分配的大小是一样的,实例化一个值类型的时候,在内存中分配的大小是不一样的,尽管如此,clr还是为每个不同的类型参数创建了不同的泛型类版本。
二、泛型类
1、多个类型参数用逗号隔开
2、泛型类的继承
继承一个泛型类的时候,必须为父类传递泛型参数
可以指定一个具体的参数类型:public class Son:Father<int,string>
可以把子类的泛型参数赋值给父类泛型参数class Son<w,y>:Father<w,y>
三、泛型约束
构造器约束:Demo2
MyDog类:
1 public class MyDog<T> where T:new()//泛型约束,传进来的T类型必须有无参数的构造函数,不能约束是否有带参数的构造函数2 {3 T t;4 public MyDog()5 {6 t = new T();7 }8 }View Code
调用:
1 protected void Page_Load(object sender, EventArgs e)2 {3 MyDog<LittleDog> dog = new MyDog<LittleDog>();4 }
基类约束:用来约束泛型参数必须是某个类的子类,一个泛型参数不允许多少基类约束,不能为密封类指定基类约束(string)。
值类型约束:public class C<T> where T:struct
引用类型约束:public class C<T> where T:class
四、泛型方法
1、泛型方法的泛型参数,可以用在该方法的形参、方法体、返回值三处。
1 public K Test<k>(K a) where K:new()2 3 {4 5 K k1=new K();6 7 return k1;8 9 }
2、泛型方法的重载
1 void SayB<T>{}2 3 //void SayB<S>{}//和上面的实质一样,不构成重载4 5 void SayB<T,T2>{}6 7 void SayB<T>(string name)8 9 //void SayB<T>(): where T:class //泛型类型约束不构成重载的条件
3、泛型方法的重写
1 public class Father 2 3 { 4 5 public virtual T Shout<T>() where T:new() 6 7 { 8 9 return new T();10 11 }12 13 }14 15 public class Son:Father16 17 {18 19 public override T Shout<t>()//在父类中设置了构造函数约束,子类中就不需要再约束了,T的名字即使不一样,也可以20 21 {22 return new T();23 24 }25 26 }View Code
------------------------------------------------------------------------------------------------------------------------------------------
软谋在线教育,最适合大学生、上班族的在线软件培训,主要教授asp.net动态网站制作,yy教育房间远程实时授课,每节课录制成高清视频课后分享,老师白天八小时全职在线辅导,不懂就问。加QQ群:138800420 即可免费试听。
新闻热点
疑难解答