C# 泛型的使用

01

泛型概述

       泛型是用于处理算法、数据结构的一种编程方法。泛型的目标是采用广泛适用和可交互性的形式来表示算法和数据结构,以使它们能够直接用于软件构造。泛型类、结构、接口、委托和方法可以根据它们存储和操作的数据的类型来进行参数化。泛型能在编译时提供强大的类型检查,减少数据类型之间的显式转换、装箱操作和运行时的类型检查。泛型类和泛型方法同时具备可重用性、类型安全和效率高等特性,这是非泛型类和非泛型方法无法具备的。泛型通常用在集合和在集合上运行的方法中。

       泛型主要是提高了代码的重用性,例如,可以将泛型看成是一个可以回收的包装箱 A。如果在包装箱 A 上贴上苹果标签,就可以在包装箱A 里装上苹果进行发送;如果在包装箱 A 上贴上地瓜标签就可以在包装箱 A 里装上地瓜进行发送。

02


泛型的使用

       在下面内容中将会详细介绍泛型的类型参数 T,以及如何创建泛型接口和泛型方法,并且通过实例演示泛型接口和泛型方法在程序中的应用。

1. 类型参数T

泛型的类型参数 T 可以看作是一个占位符,它不是一种类型,它仅代表了某种可能的类型。类型参数T可以在使用时用任何类型来代替。类型参数T的命名准则如下。

      8f8781fb22d8f548c454ceda2c203b06.png  使用描述性名称命名泛型类型参数,除非单个字母名称完全可以让人了解它表示的含义,而描述性名称不会有更多的意义。

     【例1】 使用代表一定意义的单词作为类型参数T的名称。

      代码如下:

   public interface ISessionChannel<Session>

   public delegate TOutput Converter<input, Output>

     da37209c9081fe5cb36592af6e226929.png  将T作为描述性类型参数名的前缀。

    【例2】 使用T作为类型参数名的前缀。

      代码如下:

public interface ISessionChannel<TSession>{     TSession Session{ get;}}

2.  泛型接口

泛型接口的声明形式如下: 

interface 【接口名】<T>

{

          【接口体】

}

       声明泛型接口时,与声明一般接口的唯一区别是增加了一个<T>。一般来说,声明泛型接口与声明非泛型接口遵循相同的规则。泛型类型声明所实现的接口必须对所有可能的构造类型都保持唯一,否则就无法确定该为某些构造类型调用哪个方法。

       说明 

              在实例化泛型时也可以使用约束对类型参数的类型种类施加限制,约束是使用 where 上下文关键字指定的,下面列出了 6种类型的约束。

      ① T:结构——类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。

      ② T:类——类型参数必须是引用类型。这一点也适用于任何类、接口、委托或数组类型。

      ③ T:new()——类型参数必须具有无参数的公共构造函数,当与其他约束一起使用时,new()约束必须最后指定。

      ④ T:<基类名>——类型参数必须是指定的基类或派生自指定的基类。

      ⑤ T:<接口名称>——类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束,约束接口也可以是泛型的。

      ⑥ T:U——为T提供的类型参数必须是为 U提供的参数或派生自为 U提供的参数,这称为裸类型约束。

     【例3】 创建一个控制台应用程序,首先创建一个 Factory 类,在该类中建立一个CreateInstance方法。然后再创建一个泛型接口,在这个泛型接口中调用 Createlnstance 方法。根据类型参数 T,获取其类型。

      代码如下:

//创建一个泛型接口public interface IGenericInterface<T>{     T CreateInstance();    //接口中调用 CreateInstance 方法 }//实现上面泛型接口的泛型类//派生约束 where T: TI(T 要继承自 TI)//构造函数约束 where T:new()(T 可以实例化)public class Factory<T,TI>;IGenericInterface<TI> where T: TI,new(){     public TI CreateInstance()    //创建一个公共方法 CreateInstance{          return new T();    }
}
class Program
{    static void Main(string[] args)    {//实例化接口         IGenericInterface<System.ComponentModel.IListSource> factory =new Factory<System.Data.DataTable,System.ComponentModel.IListSource>();   //输出指定泛型的类型         Console.WriteLine(factory.CreateInstance().GetType().ToString());  Console.ReadLine();    }
}

程序的运行结果如图1 所示。

d5d7b949a14b4b4ad8eedd71eff89741.png

图1  泛型接口应用

3.  泛型方法

泛型方法的声明形式如下:

【修饰符】 Void 【方法名】<类型参数T>

{

    【方法体】

}

泛型方法是在声明中包括了类型参数T的方法。泛型方法可以在类、结构或接口声明中声明,这些类、结构或接口本身可以是泛型或非泛型。如果在泛型类型声明中声明泛型方法,则方法体可以同时引用该方法的类型参数T和包含该方法的声明的类型参数 T。

说明

       泛型方法可以使用多类型参数进行重载。

     【例4】 创建一个控制台应用程序,通过定义一个泛型方法来查找数组中某个数字的位置。

      代码如下:

public class Finder     //建立一个公共类 Finder{public static int Find<T>(T[] items,T item)     //创建泛型方法 {for(int i= 0;i < items.Length;i++)          //调用 for 循环 {if(items[i].Equals(item))            //调用 Equals 方法比较两个数 {return i;                     //返回相等数在数组中的位置}}return -1;                              //如果不存在指定的数,则返回-1 }
}
class Program
{static void Main(string[] args){int i= Finder.Find<int>(new int[](1,2,3,4,5,6,8,9),6);    //调用泛型方法,并定义数组指定数字 Console.WriteLine("6 在数组中的位置:"+i.ToString());     //输出中数字在数组中的位置 Console.ReadLine();}
}

程序的运行结果是“6 在数组中的位置为5”。

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

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

相关文章

在数学世界,都有这些美妙的数学公式是你不认识的......

全世界只有3.14 % 的人关注了爆炸吧知识什么是数学&#xff1f;华罗庚说&#xff1a;宇宙之大&#xff0c;粒子之微&#xff0c;火箭之速&#xff0c;化工之巧&#xff0c;地球之变&#xff0c;生物之谜&#xff0c;日用之繁&#xff0c;无处不用数学......回首往昔&#xff0c…

Android MediaScanner:(一)MediaScanner总体架构

Android MediaScanner&#xff1a;&#xff08;一&#xff09;MediaScanner总体架构 分类&#xff1a; Android android.multimedia2012-05-19 18:29 5050人阅读 评论(5) 收藏 举报androidservice数据库工作interfaceinsert田海立csdn 2012-05-19 本文是笔者的分析归纳&#xf…

报表系统FineReport通过权限控制数据访问方案

2019独角兽企业重金招聘Python工程师标准>>> 问题&#xff1a;实际应用环境中&#xff0c;不同角色的人可能对数据具有不同的访问权限&#xff0c;通过直接在SQL语句中筛选出需要的数据制作模板可以解决该需求&#xff0c;但对于角色较多的情况&#xff0c;就需要制…

SkyWalking配上告警更优秀

前言对于监控系统来说&#xff0c;不可能让人一直盯着监控看板&#xff0c;而更多的是以自动提醒的方式&#xff0c;比如邮件、短信或微信推送等&#xff0c;当达到或超出预设的告警指标时&#xff0c;就自动发送消息提醒&#xff0c;下面就来说说如何配置SkyWalking的告警。正…

神抓拍!2020搞笑野生动物摄影大赛,哈哈哈哈哈笑到头掉

全世界只有3.14 % 的人关注了爆炸吧知识图片来自CWPAs 2020小动物们到底能有多好玩让我们来看看今年的搞笑野生动物摄影大赛吧保准叫你从头笑到尾&#xff08;以下是入围作品&#xff09;“飚自行车的”猴看起来像个酷猴▲摄影&#xff1a;Yevhen Samuchenko真情实感演绎“我太…

绝不翻车珍珠奶茶做法

1 如何在家自制珍珠奶茶▼2 儿子&#xff0c;妈妈给你烤小饼干哦▼3 放假太久了连自己哪个班都忘了▼4 想问下&#xff0c;鸟是在哪都能起窝吗&#xff1f;▼5 不到万不得已&#xff0c;绝不去做▼6 这个店名太童年阴影了▼7 小鸡做错了什么&#xff1f;▼你点的每个赞&…

施一公:“中国式科研”误国误民!表面上一片繁荣,实则深藏危机

全世界只有3.14 % 的人关注了爆炸吧知识论文和科技实力是两回事在全国政协十三届一次会议上&#xff0c;中国科学院院士、清华大学原副校长施一公曾说道&#xff1a;“我以前曾经预测&#xff0c;中国会在2020年论文数超过美国&#xff0c;没想到我们提前完成了。”但面对这项数…

正确使用和理解C#中的闭包

定义 我们把在Lambda表达式(或匿名方法)中所引用的外部变量称为捕获变量。而捕获变量的表达式就称为闭包。捕获变量 捕获的变量会在真正调用委托时“赋值”&#xff0c;而不是在捕获时“赋值”&#xff0c;即总是使用捕获变量的最新的值。如下代码所示&#xff0c;调用委托时&a…

重磅公开!36个高考数学破题大招

前段时间&#xff0c;超模君发了关于极值点偏移问题的总结资料&#xff0c;朋友们都觉得内容整合得十分详细。同时&#xff0c;也有不少很多朋友留言说希望有其他高考数学常考问题的解题总结。确实&#xff0c;毕竟高考涉及的内容非常多&#xff0c;比如说参数范围问题、数列求…

Linux服务器数据备份

2019独角兽企业重金招聘Python工程师标准>>> 服务器上的数据是如此重要&#xff0c;以至于我们定期要对其进行备份&#xff01;这里讲一下mysql的备份和使用rsync同步服务器上的文件&#xff0c;从而实现多台linux服务器之间的文件的备份。 一 Mysql备份 mysql的备份…

与毒”共舞30年!清华美女研究生为何放弃高薪,选择特招入伍?背后的原因令人泪崩......

全世界只有3.14 % 的人关注了爆炸吧知识从武汉新冠疫情爆发到如今&#xff0c;陈薇没有一天休息。短短半年间&#xff0c;54岁的她头发从黑到白&#xff0c;也哭了好几次。刚去武汉-现在陈薇的母亲也在电视上看到了女儿的变化&#xff1a;“她变老了&#xff0c;都有白头发了。…

Centos-启动network报错RTNETLINK answers: File exists解决方法

背景&#xff1a;今天在Vcenter上&#xff0c;用模板克隆了一个虚拟机&#xff0c;启动之后&#xff0c;网卡启动不了&#xff0c;报错如下&#xff1a;RTNETLINK answers: File exists说明&#xff1a; 环境 Centos6.6_X64 &#xff1b; 网卡两个原因&#xff1a; 由于用模板…

不当败家子的原因......

1 实在是太真实&#xff01;▼2 有钱就是可以为所欲为&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 在哪都要有仪式感&#xff01;▼4 送自己去孤儿院......▼5 万万没想到...&#xff08;图源网络&#xff0c;侵删&#xff09;▼6 这都能催的&#xff1f;▼…

我不信奉Scrum,我信奉敏捷

Scrum一直以来争论不断。虽然创始人Ken在演讲中曾说过即使是白痴也可以用Scrum&#xff0c;但是依然有很多人认为Scrum对团队成员的素质要求非常高。另据统计&#xff0c;75%以上的Scrum都可以称得上失败。 去年十月&#xff0c;有幸参加了Outsofting鲍央舟老师的Scrum培训。培…

仿京东商城源码java_Java+SSM实现类似京东的3C电子商城系统

需求分析基于Spring, SpringMVC, Mybatis 实现一个类似仿京东商城的3C电子商城系统, 能够实现商品管理与展示, 加入购物车, 支付购买等功能, 项目采用java技术进行开发。运行环境java, jdk1.8,tomcat8.5,mysql5.6,EclispseEE项目技术java, spring springmvc, mybatis, bootstra…

跨浏览器开发:CSS代码的金科玉律

作为Web设计师&#xff0c;你的网站在各种浏览器中有完全一样的表现是很多人的目标&#xff0c;然而这是一个永远无法真正实现的目标&#xff0c;很多人认为&#xff0c;完美的跨浏览器兼容并不必要&#xff0c;这样说虽然没错&#xff0c;但在很多情形&#xff0c;一种近似的兼…

Refit结合Polly访问ASP.NET Core Web API

前言在.NET Core应用中访问ASP.NET Core Web API接口&#xff0c;常用的方式是使用IHttpClientFactory生成HttpClient实例&#xff0c;并通过结合Polly策略&#xff0c;以实现重试&#xff0c;熔断等机制。在本文中&#xff0c;我们将介绍如何使用Refit&#xff0c;结合Polly访…

10个经典的爆炸化学反应,个个都是你惹不起的“暴脾气”

全世界只有3.14 % 的人关注了爆炸吧知识没有放过火&#xff0c;没有爆炸过&#xff0c;就不算真正学化学的。还有谁能比化学狗们的胆子更大、回忆更深刻吗&#xff1f;化学狗们能活到现在简直是个奇迹&#xff5e;&#xff5e;&#xff5e;懂的就默默转了吧&#xff01;小编整理…

狗为什么吃屎?真相男默女泪,但看完后你也会流口水......

全世界只有3.14 % 的人关注了爆炸吧知识别人笑狗太疯癫狗笑他人看不穿据说&#xff0c;200%的网友在学习一门新语言时&#xff0c;都会从最基本的日常问候语开始学起&#xff0c;例如——骂人。危险动作&#xff0c;请勿模仿。那但凡是学过汉语的人应该都知道&#xff0c;咱们中…

WPF开发登录窗口之——添加文本输入框用户控件

WPF开发者QQ群&#xff1a; 340500857 | 微信群 目前人数太多&#xff0c;暂不开放窗口开发完成后&#xff0c;接下来就是开发客户区中的输入框控件&#xff0c;但在开发之前&#xff0c;我们先开发一个输入框基类&#xff0c;然后通过继承的方式去实现文本输入框与密码输入框…