再次接触"泛型"

【学习背景】
	泛型,大家对这个词都不陌生了。很多时候,我们也在各个项目中经常见到和使用过。但对于它的一些理论知识,想必大家还是有所欠缺的,下面便是自己的补充学习过程。
【学习阶梯】
	一.什么是泛型
	当一个方法,需要被重复利用多次,但方法的参数类型并不相同,如果要想使用此方法,则需要复制此方法代码,加上不同的参数类型。为了解决这一问题,在方法中传入通用的参数类型,便是泛型。
	二.为什么要使用泛型
	下面以一个"栈"的代码实例来看:
		public class Stack
		    {
		        private int[] m_item;
		        public int Pop(){...}
		        public void Push(int item){...} //参数类型为int型
		        public Stack(int i)  //传入的参数类型必须为int型
		        {
		            this.m_item = new int[i];
		        }
		}
	上面的代码,栈中的参数类型为int型,如果现在需要将string类型的参数传进去,就需要把上面的方法复制一遍,将参数修改,改成push(string item).这样下去,只要参数类型不相同,就需要重复写一遍相同的代码。所以,为了提高代码的复用性,就需要对传递的参数进行抽象,自然想到了object类型。

三.使用object类型参数,修改以上代码

	public class Stack
	    {
	        private int[] m_item;
	        public int Pop(){...}
	        public void Push(obj item){...}  //参数类型为object类型
	        public Stack(int i)  //传入的参数为int类型
	        {
	            this.m_item = new int[i];
	        }
	}<span style="font-family:KaiTi_GB2312;font-size:18px;">
</span>
	这样的方法很好的解决了参数类型不同的问题,但这样的方法并不是十全十美的。下面就先看看使用object类型作为参数的优缺点:
	优点:
		实现了代码的复用性,提高了代码的灵活性。
	缺点:
		当处理值类型数据时,使用此代码需要经过一个装箱和拆箱的操作。数据量大的时候,性能损失严重。
		当处理引用类型时,不需要进行装箱操作,但需要将数据进行强制转换,增加了处理器的负担。
	PS:
		装箱:将值类型转换为引用类型的过程。
	      拆箱:将引用类型转换为值类型的过程。
	四.使用泛型
	下面是用泛型来重写上面的栈,用一个通用的数据类型T来作为一个占位符,等待在实例化时用一个实际的类型来代替。
	public class Stack<T>
	    {
	        private T[] m_item;
	        public T Pop(){...}
	        public void Push(T item){...}  //通用数据类型T作为参数类型
	        public Stack(int i)  //传入int类型的参数
	        {
	            this.m_item = new T[i];
	        }
	}
 	类的写法不变,只是引入了通用数据类型T就可以适用于任何数据类型,并且类型安全的。
      下面分别传入int类型的参数和string类型的参数调用方法:
	//实例化只能保存int类型的类
	Stack<int> a = new Stack<int>(100);
	      a.Push(10);
	      a.Push("8888"); //这一行编译不通过,因为类a只接收int类型的数据
	      int x = a.Pop();
	 
	//实例化只能保存string类型的类
	Stack<string> b = new Stack<string>(100);
	      b.Push(10);    //这一行编译不通过,因为类b只接收string类型的数据
	      b.Push("8888");
	string y = b.Pop();<span style="font-family:KaiTi_GB2312;font-size:18px;">
</span>
	五.使用泛型的好处
		1.他是类型安全的。实例化了int类型的栈,就不能处理string类型的数据,其他数据类型也一样。
		2.无需装箱和折箱。这个类在实例化时,按照所传入的数据类型生成本地代码,本地代码数据类型已确定,所以无需装箱和折箱。
		3.无需类型转换。
	六.泛型类中的约束
	1.数据类型的约束
		通用数据类型T就适合所有的数据类型吗?这个问题是值得思考的。答案是不一定的。所以,泛型中也需要对数据类型进行约束,约束的方式是指定T的祖先,即集成的接口或类。因为C#的单继承性,所以,约束可以有多个接口,但最多只能有一个类,并且类必须在接口之前,代码如下:
public class Node<T, V> where T : Stack, IComparable
        where V: Stack
    {...}<span style="font-family:KaiTi_GB2312;">
</span>
		相信大家对此代码并不会感觉陌生,以上泛型类的约束表明,T是必须从Stack和IComparable集成,V必须是Stack或从Stack继承,否则将无法通过编译器的类型检查,编译失败。
	2.实例化的约束
		对T进行实例化,因为类中不知道类T有哪些构造函数,为了解决这一问题,需要用到new约束,代码如下:
public class Node<T, V> where T : Stack, new()
        where V: IComparable<span style="font-family:KaiTi_GB2312;">
</span>
	3.关键字的约束
		C#中数据类型有两大类:引用类型和值类型。在泛型的约束中,我们可以大范围地限制类型T必须是引用类型或必须是值类型,分别对应关键字class和struct。代码如下:
public class Node<T, V> where T : class
        where V: struct<span style="font-family:KaiTi_GB2312;font-size:18px;">
</span>
	七.泛型方法
		泛型不仅可以用在类中,也可以用在方法中,称为泛型方法。大家应该都还记得,我们在机房收费系统中,写过一个公共的方法,也就是将DataTable转换为list集合,那便是我们自己封装好的一个泛型方法。
【学习总结】
	这一次的学习,主要是丰富了关于泛型的理论知识。对于泛型在ITOO项目中的应用,主要是出现在底层封装好的方法中。因为我们并不知道方法会传入怎么类型的参数,所以利用通用数据类型T表示,加上泛型各种约束,也就成了。最后,简言之,泛型可以提高性能、类型安全和质量,减少重复性的编程任务,简化总体编程模型。
时间: 2024-12-03 00:31:35

再次接触&quot;泛型&quot;的相关文章

PostgreSQL实现MySQL&amp;quot;insertignore&amp;quot;语法

          对MySQL熟悉的人可能都知道,MySQL 有一个"insert ignore" 语法来忽略已经存在的记录. PostgreSQL暂时不提供这样的语法,但是可以用其他方法来代替. t_girl=# d insert_ignore Table "ytt.insert_ignore" Column | Type | Modifiers ----------+------------------------+----------- id | integ

信息- VBScript 运行时错误 类型不匹配: &amp;amp;#39;[string: &amp;amp;quot;&amp;amp;quot;]&amp;amp;#39; line 12

问题描述 VBScript 运行时错误 类型不匹配: '[string: ""]' line 12 <%Option Explicit%> <%dim cartstrcartstr = getCartFromCookie()if (cartstr=NULL or cartstr ="""") then response.redirect ""Cart.asp"" response.ende

爱站频频被&amp;quot;盖帽&amp;quot; 敲响SEO细节警钟

早在9月份,罗太帅就写过一篇文章<站长工具排名终极PK 群英大盖爱站的"帽">,并率先在A5发布,没想一个月后,爱站又被另一匹"黑马"站长帮手网超越了,试问爱站频频被盖帽,原因何在?   爱站网先后被"盖帽"(图) 如今,爱站已经先后落后于群英.站长帮手网两位后辈了,作为站长工具中的领军人物,排名频繁被超越,确实是一件很让人怡笑大方的事,这就关乎到中国人常说的脸面问题了. 下面我们再次探讨下,站长帮手网为何也能超越爱站: 首先接着上次

看&amp;quot;好声音&amp;quot;节目 浅谈挖掘网站关键字的方法

     最近周五,浙江卫视播放的"中国好声音"火了,上周节目也看完了,看到了丁丁唱的"爱要坦荡荡",感觉还是挺好听的,这里呢,笔者就觉得广大站长就应该用这些娱乐节目为自己的网站添加流量,那么我们应该如何通过好声音获取关键字呢?有哪些技巧呢 首先:关键字提示离不开影视网站(优酷+土豆+搜狐)-"好声音+日期" 其实很多影视节目火起来都是通过视频网站广大的宣传,特别是优酷,土豆网上的关键字列表,首先我们观察流量最多的关键字,截图:         

Linux(centOS):Exception in thread &amp;quot;main&amp;quot; java.lang.UnsupportedClassVersionError***

问题1: Exception in thread "main" java.lang.UnsupportedClassVersionError: HWByCentOS : Unsupported major.minor version 52.0 现象:在安装完jdk后,执行javabean.class文件时候出现错误            javac HWByCentOS.java            java HWByCentOS   (***)            使用javac

由&amp;quot;缓存&amp;quot;到&amp;quot;Memcached分布式缓存&amp;quot;

[学习背景] 在ITOO4.0的时候,自己听了师哥师姐的技术分享,从那开始,Memcached 就留在脑海中了.现在,我们开始了ITOO4.1,在师父的指导下,开始缓存的学习.自然地,我第一时刻想到的便是Memcached. [学习阶梯] 在正是进入Memcached之前,自己先了解了些关于"缓存"的知识. 一.什么是缓存 用来暂时存储数据,避免频繁连接数据库或磁盘文件.一般来说,缓存比数据库或磁盘容量更小,但存取速度快. 二.缓存的作用 存储频繁访问的数据:临时存储耗时的计算结果:内

服务器-URL传参中文乱码,new string(&amp;amp;quot;iso-8859-1&amp;amp;quot;,&amp;amp;quot;utf-8&amp;amp;quot;)方法不行

问题描述 URL传参中文乱码,new string("iso-8859-1","utf-8")方法不行 小白接触后台不多,用myecplise开了一个服务器(tomcat),其中有url参数:http://xxx(ip)/downloadservlet?name=小儿鼻出血.mp4 ,然后出现乱码,服务器无法定位到该文件. 查网发现大部分对name进行转码,用name= new string("iso-8859-1","utf-8&qu

还原快播&amp;quot;地下&amp;quot;利益链

快播最好的时代已经过去. 5月20日下午,深圳市市场监督管理局对深圳市快播科技有限公司(下称"快播科技")送达了拟行政处罚听证通知书,拟对快播处以2.6亿元罚款,理由是初步确定其违反相关知识产权方面的法律法规. 而在事发一个月前,快播科技曾连发两条微博表示将关闭QVOD服务器,并从技术转型原创正版内容,这也就意味着"搜索电影.点开网站.快速播放"的快播模式将不复存在,这更意味着用户无法再使用快播播放器通过第三方网站链接观看大量涉嫌盗版和色情的视频内容.这个号称&qu

android仿支付宝付款成功及&amp;quot;天女散花&amp;quot;效果实现——看PathMeasure大展身手

话说,在前面两篇文章中,我们学习了BitmapShader.Path的基本使用,那么这一篇文章,咱们接着来学习一下PathMeasure的用法.什么,你没听说过PathMeasure?那你就要OUT咯~ 项目效果图 废话不多说,在开始讲解之前,先看下最终实现的效果. 效果一: 仿支付宝支付成功效果 效果二: 这两个项目都是使用Path和PathMeature配合完成的,由其他项目改造而来 项目一是七叔写的,我对代码进行了大量改造. 项目二是不小心搜到的,然后进行了改造,原文请戳这里 本文代码请到