在开始动手写自己的泛型List<T>之前,咱们先来看一下非泛型的缺点 非泛型的缺点: 1、大量类型转换 ArrayList AL=new ArrayList(); AL.Add(1); //存在装箱操作 2、运行时错误 ArrayList AL = new ArrayList(); AL.Add(1); AL.Add("2"); foreach (int i in AL) { Console.WriteLine(i); //当遍历到第二个元素时就会报错,运行时错误 } 装箱就是将一个值类型转换成引用类型,耗费性能。 那么什么是泛型呢? 2.0 版 C# 语言和公共语言运行库 (CLR) 中增加了泛型。泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数 T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险。 泛型的简单理解就是把类型当成参数:
来看一个例子(为了操作方便,所有程序均在控制台下实现):
当然这个方法没有什么实际意义,只是助于我们能更好的理解泛型,下面看一下在主函数是怎样调用的
看一下运行结果
到这一步,算是对泛型有一个大概的理解了。现在来看一下泛型类,。泛型类最常用于集合,如链接列表、哈希表、堆栈、队列、树等。像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的类型无关。微软封装了一个功能强大List<T>泛型集合,用法和ArrayList基本相同。现在来创建一个自己的泛型类,名字就叫做MyList
为了能仿造List<T>,咱们先来看一下它有哪些属性和方法
运行结果
好了,我们知道List<T>中常用的方法有添加元素、删除元素、清空,属性有集合的容量,集合内元素的个数。 知道了这些,就来实现自己的MyList<T>类
下面来具体实现每一个方法和属性,下面是两个构造函数
下面是集合容量。
下面是元素的个数,不能在外部给它赋值,所以定义成只读的
再然后就可以添加元素了:
开始移除元素:
为了使自定义泛型集合能像数组一样可以通过下标索引,定义索引器:
清空所有元素(集合的容量不变)
最后是:
到这一步我们自己的MyList就构建完成,哈哈!小高兴一把,微软的东西自己也能做出来。现在来试验能不能成功!
到这里,我们看到自定义的泛型集合能正常使用,除了List<T>的一些方法没实现外,其他的都能满足需求了,感兴趣的朋友可以做一做,欢迎和我交流。。。。。 |