浅谈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,一经查实,立即删除!

相关文章

【半小时大话.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;当某个位置斜率大于当前位置的时…

基于 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…

使用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​&…

架构杂谈《一》

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

hdu 3308 LCIS 线段树 + 区间合并

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

从零开始实现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的子集都…

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

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

容器化单页面应用中RESTful API的访问

最近在工作中&#xff0c;需要让运行在容器中的单页面应用程序能够访问外部的RESTful API。这个需求看起来并不困难&#xff0c;不过实现起来还是有些曲折的。在此&#xff0c;我就将这部分内容总结一下。在入正题之前&#xff0c;有个一问题&#xff0c;就是为什么要将单页面应…

LogoSharp:Logo语言的C#实现

上周在朋友中问了一圈&#xff0c;发现没有几个人知道Logo语言的&#xff0c;或许&#xff0c;这门古老的语言现在用的人已经非常少了&#xff0c;除了国外有少量的用户将Logo语言用于教育外&#xff0c;估计国内不会有人使用这门语言。其实&#xff0c;Logo语言本来也就是以编…

Hello Kubernetes快速交互实验手册

“ K8S在线实验室提供了一个交互实验环境&#xff0c;现将这部分文章精简并翻译为中文&#xff0c;希望对那些不了解K8S的童鞋有帮助&#xff0c;能够快速玩起来有个感性认识...”原文&#xff1a;https://kubernetes.io/docs/tutorials翻译&#xff1a;Edison ZhouHello Kuber…

2020 ICPC 上海 Sum of Log 数位dp + 状态剪枝

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 观察可以发现&#xff0c;由于i&j0i \And j0i&j0&#xff0c;所以log2(ij)log_2(ij)log2​(ij)表示的应该是ijijij的111的最高位。 一个显然的dpdpdp状态就出来了f[pos][flag1][fl…

从MVP到微软产品经理的几点心得

昨天&#xff0c;我应邀在微软2019年暑期实习生的入职培训活动上做了一个简短的分享 —— 以我自身的职业发展过程为例&#xff0c;给大家讲了一讲我是怎样从一个技术爱好者&#xff0c;到获得第一个MVP&#xff08;微软最有价值专家&#xff09;的荣誉奖项&#xff0c;以及后来…

小白开学Asp.Net Core 《六》 —— 探究.Net Core 跨平台的奥秘

1、写这篇文章的初衷有好多朋友反馈看不懂我写的开源的一个练手项目&#xff08;GitHub&#xff1a;https://github.com/AjuPrince/Aju.Carefree&#xff09;也有好多人都希望我能写一些简单的入门的文章&#xff0c;记得前几天在群里有人问为什么 .Net Core 能跨平台&#xff…

Codeforces Round #636 (Div. 3) D. Constant Palindrome Sum 思维 + 差分

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先有一个显然的性质就是每组操作最多不会超过两次。 很容易想到一个很暴力的思路&#xff0c;就是枚举x∈[1,2∗k]x \in [1,2*k]x∈[1,2∗k]&#xff0c;让后判断一下每组需要操作几次取…

C#8.0: 在 LINQ 中支持异步的 IAsyncEnumerableT接口

C# 8.0中&#xff0c;提供了一种新的IAsyncEnumerable<T>接口&#xff0c;在对集合进行迭代时&#xff0c;支持异步操作。比如在读取文本中的多行字符串时&#xff0c;如果读取每行字符串的时候使用同步方法&#xff0c;那么会导致线程堵塞。IAsyncEnumerable<T>可…

Codeforces Round #636 (Div. 3) E. Weights Distributing 思维 + bfs

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤2e5,m≤2e5n\le2e5,m\le2e5n≤2e5,m≤2e5 思路&#xff1a; 怎么感觉每场div3div3div3都有一个巧妙的图论题。 首先如果只有两个点的话&#xff0c;肯定是一次bfsbfsbfs之后取前disdisdis小的www作为边权…

解读 Microsoft.NET.Sdk 的源码,你能定制各种奇怪而富有创意的编译过程

在 csproj 中&#xff0c;Project 中的 Sdk 属性是 MSBuild 15.0 开始支持的&#xff0c;也就是 Visual Studio 2017 开始支持。有了 Sdk 属性的存在&#xff0c;MSBuild 编译过程能够扩展得非常强大&#xff0c;而不止是过去 Import 的一个 props 和 targets 文件。本文将介绍…