浅谈C#泛型

一.为什么要提出泛型的概念

我们在声明对象或者方法中,对象中成员变量的定义或者函数参数都传递都要指定具体的对象类型,但是有的时候参数的类型是变化的,但是实现的功能却又差不多,这个时候我们就想,是否存在一种东西可以将参数的位置“占住”,当传递具体的对象类型是再用这个类型取替换被占住的位置,这个时候就提出了泛型的概念,是不是有点绕,但是看完下面的例子就清除这里表达的内容了,泛型有多种表现形式,泛型类,泛型方法,泛型集合,泛型委托,可以说不懂泛型就没有真正的了解C#,下面让我们来开始泛型的学习吧。

二.泛型类,泛型方法

我们先举个例子,我们定义一个类来模拟入栈出栈操作,我们操作出栈入栈时要针对各种数据类型,int型,double 型,字符型......总之各种类型都有可能,我们不可能针对每个类型都写一个类来操作出栈入栈,这显然是不现实的,这个是时候就该泛型大显身手发时候了,看下面的定义:

640?wx_fmt=png

我们在 public class MyStack<T> 后面加了一个<T>这个时候这个类就变成了一个泛型类,表示一个占位符,当我们实例化该类的时候需要传入具体的数据类型,我们来看一下泛型类的具体用法:

这样泛型类就可以操作int 类型 和 string类型进行出栈入栈操作但代码却不需要改动。

三.泛型集合

 使用泛型集合首先是是加了类型安全,方便编程,泛型集合指定了类型后只能将同类型的参数放入集合,泛型集合最常用就是List集合和Dictionary集合,我们分别看一下这两种集合。

A.Lis<T> 泛型集合

说到List泛型集合就不得不说ArrayList集合,ArrayList集合在操作是需要进行强制类型,极大的降低了代码处理效率所以,List集合应运而生,让我们看如下代码做个比较:

640?wx_fmt=png

除此之外,我们一直在讲泛型集合可以保证数据安全,和ArrayList相比它的数据到底安全在什么地方呢,我们通过下面的例子做进一步说明:

640?wx_fmt=png

从例子可以看出ArrayList集合的Add方法参数是object类型,所以Teacher的数据类型也可以放进去,这显然不是我们想要的,但是泛型集合就不一样,当占位符被确定的数据类型占用后,别的数据类型就添加不到集合中去。

List集合的常用方法,List集合中有很多方法,我们重点将一下Sort方法,Sort方法有四个重载方法,public void Sort();,public void Sort(Comparison<T> comparison);,

public void Sort(IComparer<T> comparer);,public void Sort(int index, int count, IComparer<T> comparer);我们直接调用Sort方法是按默认升序排序,假如某个类实现了IComparable接口那么默认排序就是按照接口中定义的方法来排序,看下面的例子:

输出结果为:0,1,2,3......结果为升序排序

输出结果为:a,b,c

假如是对象类型呢,默认的排序方法为升序排序,但是对象之间没有升序的概念,这个时候该怎么办呢,看下面的代码:

640?wx_fmt=png

Students类中实现了泛型接口IComparable<T> ,在泛型接口的方法中我们可以写排序的方式,这样做确实可以解决对象排序的问题,但是假如我们的排序条件是变化的,这种方式显然又不能满足我们的需求了,让我i们接着往下探索,如何实现集合对象的动态排序,让我们看如下代码:

640?wx_fmt=png

我们定义了一个自定义排序类,自定义排序类实现了ICompare接口。

640?wx_fmt=png

调用List.Sort的重载方法,这里基于接口实现了多态,需要好好体会,关于集合的排序我们还可以用Linq查询。

B.Drictionary<> 泛型集合

 List集合用索引查找元素的方法显然没有办法满足我们的实际需求,为了弥补这个缺陷,我们引入了字典的概念,说到键值对查询又不得不说说Hashtable,早期键值对集合都是用Hashtable类来实现的,后来泛型集合出现后Dictionary泛型集合取代了Hashtable类,让我们来看看两者的区别:

640?wx_fmt=png

从例子可以看出Hashtable集合操作都是object的类型,在进行对象操作是需要进行强制类型转换,但是Dictionary却不一样,不需要进行强制类型转换,所以可以这样讲Dictionary出现以后可以完全替Hashtable。

四.泛型委托

 A.自定义泛型委托

640?wx_fmt=png

以上例子就简单展示了自定泛型委托的使用方法,但是每次都这这么定义委托似乎很不方便,所以微软的工程师预先给我们定义好了几个泛型委托,我们可以直接使用,大大提高了使用泛型委托的便捷程度。

B.Func泛型委托的使用

 Func是一个带返回值的泛型委托,func有多个重载版本,需要注意的是func最后一个参数是返回值类型,如果前面有泛型类型的参数,这个参数就是委托方法的形参类型,简单说func泛型委托就是一个带返回值的方法签名,我们先来看看它的简单应用:

640?wx_fmt=png

有人会说这样用似乎没什么意义,我们调用方法就可以直接实现功能,干嘛还要从委托转一下似乎多此一举,但是事实并不是如此,让我们看一下Func的复杂用法。现在提出一个需求,要求计算数组中任意指定开始位和结束位的“算数和” and 算数积。常规做法是:

640?wx_fmt=png

写两个方法,分别计算和与积,但是还有别的实现方法么,答案是肯定的:

640?wx_fmt=png

其实这里也体现了委托的本质,委托本来就是为了把方法当成参数传递而设计的。

C.Action泛型委托

Action泛型委托和func泛型委托差不多,只不过Action是不带返回值的方法的签名,看下面的例子我们就可以了解Action泛型委托的用法:

D.Predicate泛型委托

 Predicate<T>委托定义如下:
 public delegate bool Predicate<T>(T obj);
 解释:此委托返回一个bool值的方法
 在实际开发中,Predicate<T>委托变量引用一个“判断条件函数”,
 在判断条件函数内部书写代码表明函数参数所引用的对象应该满足的条件,条件满足时返回true

看下面的例子:

640?wx_fmt=png

好的以上就是关于泛型概念的总结,希望可以帮到有需要的人。

原文地址:https://www.cnblogs.com/Artist007/p/11089085.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round #635 (Div. 1) C. Kaavi and Magic Spell 区间dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两个串s,ts,ts,t&#xff0c;每次都可以从sss的开头拿一个字符放到AAA串的开头或结尾&#xff0c;问最终有多少种方案使得ttt是AAA的前缀&#xff0c;注意sss不必全部拿完。 m,n≤3000m,n\le3000m,n≤30…

【IOI2018】会议【笛卡尔树】【dp】【线段树】

题意&#xff1a;长度为nnn的序列&#xff0c;qqq次询问&#xff0c;每次给定一个区间&#xff0c;钦定区间中的一个位置xxx&#xff0c;使得区间所有点 与xxx之间的最大值&#xff08;含端点&#xff09; 之和 最小&#xff0c;输出最小值。 n,q≤7.5105n,q\leq7.5\times10^5n…

【半小时大话.net依赖注入】(一)理论基础+实战控制台程序实现AutoFac注入

第一章|理论基础实战控制台程序实现AutoFac注入第二章|AutoFac的常见使用套路第三章|实战Asp.Net Framework Web程序实现AutoFac注入第四章|实战Asp.Net Core自带DI实现依赖注入第五章|实战Asp.Net Core引入AutoFac的两种方式简介该系列共5篇文章&#xff0c;旨在以实战模式&am…

P4198 楼房重建 线段树 + 区间合并

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 题面有点问题&#xff0c;按照人类正常的理解来就好啦。 思路&#xff1a; 可以想到维护每个位置的一个斜率&#xff0c;模拟的话就是从第一个位置开始向后选&#xff0c;当某个位置斜率大于当前位置的时…

【IOI2018】狼人【Kruscal重构树】【主席树】

题意&#xff1a;nnn个点mmm条边的无向图&#xff0c;qqq次询问&#xff0c;每次给定s,t,L,Rs,t,L,Rs,t,L,R&#xff0c;判断是否存在一条sss到ttt的路径&#xff0c;使得路径上可以找到一点kkk,满足此路径s∼ks\sim ks∼k的部分标号都≥L\geq L≥L且k∼tk\sim tk∼t标号都≤R\…

基于 Docker Compose 实践 .NET Core 的现代化架构 2:在容器中集成 Skywalking APM

本章节代码已经上传至 https://github.com/siegrainwong/.NET-Core-with-Docker/tree/master/Part2系列大纲还是先介绍一下目录&#xff0c;这次我们讲第二篇&#xff1a;用 docker-compose 启动 WebApi 和 SQL Server在容器中集成 Skywalking APM通过 nginx-proxy 对 ES、Skyw…

【雅礼集训2017】字符串【后缀自动机】【数据分治】

题意&#xff1a;给定一个字符串SSS和mmm个区间[li,ri][l_i,r_i][li​,ri​],qqq次询问&#xff0c;每次给定长度为kkk的字符串www和区间[a,b][a,b][a,b]&#xff0c;求对于所有i∈[a,b]i\in[a,b]i∈[a,b]&#xff0c;www在[li,ri][l_i,r_i][li​,ri​]内的子串在SSS中出现次数…

AtCoder Regular Contest 100 E - Or Plus Max Sos dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为2n2^n2n的数组&#xff0c;让你对于所有的1≤k≤2n−11\le k\le 2^n-11≤k≤2n−1求最大的aiaj,0≤i<j≤2n−1,iorj≤ka_ia_j,0\le i<j\le2^n-1,i\ \ or \ \ j\le kai​aj​,0≤i<j≤…

使用Minikube部署本地Kubernetes集群(二十九)

前言 使用Minikube部署本地k8s集群相对比较简单&#xff0c;非常推荐将其用于本地k8s开发环境&#xff0c;唯一麻烦点的仅仅是网络问题。在本篇教程中&#xff0c;我们使用了国内的镜像来完成本地k8s集群的搭建。如果搭建过程中出现错误&#xff0c;建议使用mini…

Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) F. Bits And Pieces sosdp预处理超集

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤1e6,ai≤2e6n\le1e6,a_i\le2e6n≤1e6,ai​≤2e6 思路&#xff1a; 由于(aj&ak)(a_j \And a_k)(aj​&ak​)打的括号&#xff0c;所以应该放在一起考虑&#xff0c;现在我们可以枚举aia_iai​&…

【PKUWC2018】随机算法【状压dp】【组合计数】

题意&#xff1a;一张nnn个点mmm条边的无向无权图&#xff0c;求以下算法计算最大独立集的正确率&#xff1a;随机一个排列&#xff0c;依次考虑排列中每一个点&#xff0c;如果不与任何一个独立集中的点相邻则将其加入独立集。模998244353998244353998244353。 n≤20n\leq20n≤…

架构杂谈《一》

架构杂谈《一》从传统单体架构到服务化架构的发展历程典型的单体架构分为三个层级&#xff0c;Web层、业务逻辑层和数据存储层&#xff0c;每个层的指责分别如下&#xff1a;Web 层&#xff1a;负责与用户交互或者对外提供接口业务逻辑层&#xff1a;为了实现业务逻辑而设计的流…

hdu 3308 LCIS 线段树 + 区间合并

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 日常水一篇题解。 带修改的求区间连续的递增序列&#xff0c;我们考虑用线段树维护。 直接维护mlenmlenmlen是区间最长的递增序列&#xff0c;lslsls是从左端点开始的最长递增序列&#xf…

【ARC103D】Distance Sums【树论】【构造】

题意&#xff1a;一棵nnn个点的无权树&#xff0c;给定每个点iii到其他所有点的距离之和did_idi​&#xff0c;保证did_idi​两两不同。构造或判断无法构造一棵满足条件的树。 n≤105n\leq 10^5n≤105 首先对于非根结点uuu&#xff0c;有 dudfau−sizu(n−sizu)d_ud_{fa_u}-si…

从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板

标题&#xff1a;从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板作者&#xff1a;Lamond Lu地址&#xff1a;https://www.cnblogs.com/lwqlun/p/11155666.html源代码&#xff1a;https://github.com/lamondlu/DynamicPlugins在上一篇中&#xff0c;我们介绍…

Codeforces Round #112 (Div. 2) E. Compatible Numbers sosdp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 以下假设all1<<22all1<<22all1<<22。 转化问题&#xff0c;对于每个aia_iai​我们都计算xaixorallxa_i\ \ xor \ \ allxai​ xor all&#xff0c;对于所有xxx的子集都…

【CF1349D】Slime and Biscuits【概率期望】【解方程】

题意&#xff1a;nnn个人共有mmm个饼干&#xff0c;每轮随机选一个饼干随机给一个另外的人&#xff0c;所有饼干都在一个人手里时游戏结束&#xff0c;求期望进行次数。模998244353998244353998244353。 n≤105,m≤3105n\leq10^5,m\leq3\times10^5n≤105,m≤3105 首先肯定是每…

多租户通用权限设计(基于 casbin)

所谓权限控制, 概念并不复杂, 就是确认某个操作是否能做, 本质上仅仅就是个bool判断.权限几乎是每个系统必不可少的功能, 和具体业务结合之后, 在系统中往往表现的非常复杂和难于控制, 很大部分原因是把权限和具体业务结合的太过紧密, 把业务的复杂度也加入到权限控制中来了.一…

Codeforces Round #225 (Div. 1) E. Vowels 容斥 + sosdp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你nnn个长度为333的串&#xff0c;串的每个字母都在a−za-za−z范围内&#xff0c;定义一个串合法当且仅当这个串中含有至少一个元音字母。现在他忘记了元音字母都有那几个&#xff0c;显然有2242^{24}224…

【CF1344D】Résumé Review【数学】【二分】

题意&#xff1a;给定长度为nnn的自然数序列aaa和整数kkk&#xff0c;要求构造长度为nnn的自然数序列bbb&#xff0c;使得0≤bi≤ai,∑bik0\leq b_i\leq a_i,\sum b_ik0≤bi​≤ai​,∑bi​k&#xff0c;且∑bi(ai−bi2)\sum b_i(a_i-b_i^2)∑bi​(ai​−bi2​)最大化。 n≤105…