C#泛型(一)石shi

先看看泛型的概念--“通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用”。

很多初学者在刚开始接触泛型的时候会比较难理解“泛型”在这里先把“泛型”当作一个形容词这样比较方便理解因为很多东西都可以是泛型的比如--

“泛型的类”,“泛型的方法”,“泛型的接口”,“泛型的委托”等...很多时候我们使用泛型可以极大减少代码重复使程序更加清爽,也可以避免不必要的‘装箱’‘拆箱’过程。

<泛型的引入|为什么要有泛型?>

在程序设计的过程中我们常常会遇到这样的情况:为了实现某一个功能我们一开始把方法写好,但后来我们发现同样的功能需要我们再写一次但是这次方法的参数类型和上次不一样了,这个时候按照敏捷软件开发的思想,不要过早的进行抽象和应对变化,当变化第一次出现时,使用最快的方法解决它,但变化第二次出现的时,在进行更好的架构设计,这样的目的是为了避免过度设计,因为有可能第二次变化永远也不会出现。考虑到功能一样,所这里我们通常会直接复制原方法的代码,然后修改一下参数类型即可快速解决;这样做确实没错,但是有的时候不仅出现了第二次变化还出现了第三次...或者是更多次变化,继续使用CV大法修改方法的签名将会导致大量重复代码的出现,于是我们就会想,要是存在一个可以传递任何数据类型的方法那多好,即把这个方法的实现当成模板把方法的签名抽象出来,于是我们引入了泛型。

下面我们来看一下具体的例子:

1.普通的写法:

-输入多个int类型,进行冒泡排序让它们依次重小到大输出,代码如下:

publicclassSortHelper{publicvoidBubbleSort(int[]arr){intlength=arr.Length;for(inti=0;iarr[j+1]){inttemp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}}测试:

//控制台程序输出staticvoidMain(string[]args){SortHelpersorter=newSortHelper();int[]a={4,5,1,3,2,8,5,0,2};sorter.BubbleSort(a);}

输出为:0,1,2,2,3,4,5,5,8

---------------输入多个Byte类型,进行冒泡排序让它们依次重小到大输出,代码如下:

这个时候我只要复制一下原来的方法改一下签名就可以了

publicclassSortHelper{publicvoidBubbleSort(byte[]arr){intlength=arr.Length;for(inti=0;iarr[j+1]){bytetemp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}}这样做虽然可以,但是往后若要处理N次各种其他数据类时就就要大量重复复制严重影响代码的简洁度,而且当功能要扩展时,每个方法都要修改,维护起来非常不方便。

1.2使用泛型(泛型类):

我们自然而然的会这样想了如果可以把方法中的参数类型用一个”占位符“表示每次传入什么类型他就变成什么类型,这样就可以将这个方法当成一个模板用了(有点像Web编程中在Html中使用占位符)。

这里我们用“T”来便是这个特殊的参数类型,于是代码就变成了这样:

publicclassSortHelper{publicvoidBubbleSort(T[]arr){intlength=arr.Length;for(inti=0;iarr[j+1]){Ttemp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}}

这里T代表”类型的类型“和int,string...等数据类型相似,T就是类型本身。让人兴奋的是真的有像“T”这样的特别存在,在.NET中叫做类型参数.下面我们看看规范的代码--

这里我们把BubbleSort定义成泛型类定义泛型类的一种方法是在类后面加上“

//定义泛型类SortHelper这里“whereT:IComparable”是给类型参数T一个限制--参数类型必须实现IComparable接口,否则无法通过编译publicclassSortHelperwhereT:IComparable{publicvoidBubbleSort(T[]arr){intlength=arr.Length;for(inti=0;i0){Ttemp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}}复制代码测试:

staticvoidMain(string[]args){SortHelpersorter=newSortHelper();byte[]a={4,5,1,3,2,8,5,0,2};sorter.BubbleSort(a);SortHelpersorter1=newSortHelper();int[]b={4,5,1,3,2,8,5,0,2};sorter1.BubbleSort(b);//输出省略}

输出为:

0,1,2,2,3,4,5,5,8

---------------输入多个自定义类型的实例,进行冒泡排序让它们依次重小到大输出,代码如下:

下面我们来模拟一下宠物店卖的猫按价格排序

猫类:

publicclasscat:IComparable{publicstringname;publicintprice;publicintCompareTo(objectobj){catcatT=(cat)obj;returnthis.price.CompareTo(catT.price);}publiccat(stringname,intprice){this.price=price;this.name=name;}}测试:

*泛型与集合类型(ArrayList)

概要:通过泛型可以大大提高集合类型的的性能恶化安全性。

下面我们来看一个例子

2.1非泛型的集合类

先是往集合里存放3个数据

ArrayListlist=newArrayList();intlistSize=3;for(inti=0;i

测试:

输出

0

1

2

有经验的读者在这里可能会注意到了,这样子写虽然能运行通过,但是这里当list每次调用Add方法时就做了一次”装箱“操作,接着每次取数据时对list的元素进行一次强制转换(int)list[i]同时也做了一次“拆箱”操作,这两个操作对.NET来说是比较耗时的,当操作的次数越多效果就越明显;

2.3使用泛型集合类型(泛型数组)

总结:

看到这里相信大家明白为什么要引入泛型了吧,通过使用泛型-

1.可以避免同种功能代码的大幅度重复出现使我们的代码更加简洁/可读性更高

THE END
1.小学英语课程表在网上搜索“小学生英语语法大全”,会找出来各种思维导图或者文档内容,虽然都是帮助孩子记忆,但面对如此密密麻麻的内容,小学生也难免会有畏难情绪。这些是优秀的英语老师,总结出的最简单最适合学习的小学生英语语法大全,希望孩子们都能提起学习英语的兴趣,轻轻松松掌握必备语法知识!https://www.meipian.cn/297omv2p
2.导航栏半透明(translucent)时announcement的约束写法导航栏半透明(translucent)时announcement的约束写法 @(编程笔记)[iOS开发,UI布局] 本文使用SnapKit进行约束布局 当导航栏设置translucent为false时,导航栏不透明,UI布局从导航栏下开始。 但当导航栏的translucent为true,UI布局从顶端开始,这个时候如果announcement设置约束top.equalTo(superview),那么就会被导航栏盖住。 https://www.jianshu.com/p/a8f9946322f2
1.穿越成宠物店《穿书之成为宠物店店主》最新章节:《穿书之成为宠物店店主》最新章节 第二十章 2024-07-10小说简介:一朝穿书,虞乐安成为书中炮灰角色,前世孤苦无依,在这里集万千宠爱于一身,为求活的长命百岁,远离剧情君是正事,穿书而来,发现自己还有个鸡肋金手指,天生受小动物亲近喜欢,于是开家宠物店,就这样开始了自己的书途之旅内容...https://u.xinremenxs.com/book/57_4725343_6685738.shtml
2.长春版小学二年级下册语文《鹅妈妈的故事》教案如《春风带我去散步》《最后一片银杏树叶》《宠物店里的故事》《与众不同的麻雀》《毛毛虫的故事》《书里的蚂蚁》等等,能够让学生读后产生深深地思索,明白很多做人的道理,充分体现了语文学科工具性和人文性的统一。教材还编排了3篇神话,《孙悟空大闹蟠桃会》《精卫填海》《夸父追日》,重在让学生感受古代优美的...https://www.360wenmi.com/f/file5543nkb0.html
3.华清远见重庆中心框架阶段技术个人总结SSH:最初是Spring+Stucts2+Hibernate组成,之后Stucts2被SpringMVC取代。 SSM:Spring+SpringMVC+MyBatis 新项目使用SpringBoot,早起的SSH项目由于维护成本高,基本不会推翻重做,但会维护一些SSM项目。 无论是SSH还是SSM,Spring、SpringMVC必不可少。从2004年推出至今,依旧是主流框架中不可获取的一部分。 https://blog.csdn.net/lslc2000/article/details/129093508
4.商业策划书(15篇)在进行投资项目评估时,投资人最关心的问题之一就是,风险企业的产品、技术或服务能否以及在多大程度上解决现实生活中的问题,或者,风险企业的产品(服务)能否帮助顾客节约开支,增加收入。因此,产品介绍是商业计划书中必不可少的一项内容。通常,产品介绍应包括以下内容:产品的概念、性能及特性;主要产品介绍;产品的市场竞争...https://www.yjbys.com/cehuashu/3639736.html
5.最初处理QueryList更改Angular2简单的更改QueryListAngular2 -简单的更改QueryList 突出显示最初有效,但在哈希值更改时无效 如何更改最初由timelineMax设置的div的属性? 当最初通过url #选择不同的标签时,处理延迟加载标签 处理TDD接口更改 更改处理程序expressjs 为什么事件处理程序返回的事件最初是“未定义”的? https://cloud.tencent.com/developer/information/%E6%9C%80%E5%88%9D%E5%A4%84%E7%90%86QueryList%E6%9B%B4%E6%94%B9-article
6.总裁的婚事《总裁婚事》小说简介:初见邵明阳那年,她的母亲逝世,家族的逼迫让她退无可退。姨母说她是祸害,他墨色的眸子莫名的盯着姨母,半响后,淡淡开口:“厉姨,我的女人,也是你能评价的?”一句话,注定一见倾心,从此蓝星夜的心里多了个叫‘邵明阳’的男人,三年后再遇,她鼓起勇气跟他表白,却不想他身边已经有了娇俏的未婚妻。“邵明阳…...https://d.qqzuankuo.com/book/52_882628_9191497.shtml
7.《好朋友》教学设计15篇课件演示:建立自然保护区、设立保护法、建立动物医院与宠物店等相关图文资料。师:全国各地都设有自然保护区,为动物朋友们提供安全而又温馨的家园。为了保护动物的健康,我们还能做些什么? 生1:建立动物医院。动物和我们人类一样,也会生病,这样它们就不会因为生病而痛苦或死亡了。 https://www.ruiwen.com/jiaoxuesheji/7410991.html
8.精选小学数学教案过渡语:刚才去了宠物店,当了一回购物小达人,你们想自己当老板吗?(想) 好!现在你们来当设计师,设计一家自己的商店。 要求: (1)画上你最喜欢的物品,标上价格。 (2)提出3个以上的除法问题。 学生创作,师巡视。 学生展示自己的作品。 没有展示的作品回家后可以将作品发到我们班级数学微信群,同学们可以和爸爸...https://www.fwsir.com/jiaoan/html/jiaoan_20230705142125_3029223.html
9.小学数学教案集锦15篇过渡语:刚才去了宠物店,当了一回购物小达人,你们想自己当老板吗?(想) 好!现在你们来当设计师,设计一家自己的商店。 要求: (1)画上你最喜欢的物品,标上价格。 (2)提出3个以上的除法问题。 学生创作,师巡视。 学生展示自己的作品。 没有展示的作品回家后可以将作品发到我们班级数学微信群,同学们可以和爸爸...https://www.unjs.com/jiaoan/shuxue/xiaoxue/20240608070222_8230448.html
10.春字宋体字怎么写(春字的写法有几种)春字的写法有8种,分别为:甲骨文、金文、篆文、隶书、楷书、行书、草书、宋体,如下图: 春拼音:chūn 释义: 1、一年的第一季:春季(农历正月至三月)。春节。春色。春晖(春天的阳光,喻父母的恩情)。春山(春天的山,山色如黛,喻妇女的眉毛)。春秋(春季和秋季;指年月;指人的年岁,如“春春正富”;指中国古代的...https://www.xuexi88.com/zhishi/550906.html