泛型(Generic),是将不确定的类型预先定义下来的一种C#高级语法,我们在使用一个类,接口或者方法前,不知道用户将来传什么类型,或者我们写的类,接口或方法相同的代码可以服务不同的类型,就可以定义为泛型。这会大大简化我们的代码结构,同时让后期维护变得容易。

泛型很适用于集合,我们常见的泛型集合有:List<T>,Dictionary<K,V>等等(T,K,V就代表不确定的类型,它是一种类型占位符),无一不是利用的泛型这一特性,若没有泛型,我们会多出很多重载方法,以解决类型不同,但是执行逻辑相同的情况。

自定义泛型:

    学会自定义泛型,那么遇到微软为我们预先定义好的泛型数据结构也会很容易理解。

支持泛型定义的数据结构有类,接口,方法,委托

定义泛型的方法就是在名称后添加<T>,T可以是任何字符,可以定义多个泛型<T1,T2...>,只要符合C#命名规范即可,但我们一般用只T,定义以后,在其代码块中的任何位置即可引用这一类型T,我们在用的时候传入的类型,会替代所有的T,所以不要认为泛型是弱类型,它是强类型的。

下面进行代码演示:

public class MyGeneric<T>{...code...}//泛型类
public T GenericMethod<T>{...code...}//泛型方法
interface IGeneric<T>{...code...}//泛型接口
delegate void DeleGeneric<T1,T2>();//泛型委托

default关键字:

    在switch语句中,用到了default关键字,用于匹配case没捕获到的情况,在泛型中,由于T可能是值类型也可能是引用类型,我们编码时无法确定,所以我们无法通过正常形式,将T赋给一个既定的类型,所以有如下语法:

defalut(T);//根据类型被赋值类型,引用类型则返回null,值类型则返回对应的默认值

约束类型:

    为了避免用户随意使用泛型,我们可以给泛型加约束,约束关键字是where,我们可以把泛型设置为必须继承某个类,或者必须是引用或者值类型(泛型方法也可以设置约束,但显然有些约束不适合方法,比如继承某个类,这是类特有的性质),请先看如下代码:

class MyGeneric<T> where T:SuperGeneric,new(){...}
class MyGeneric<T1,T2> where T1:new() where T2:new(){...}
class MyGeneric<T> :IEnumerable where T:SuperGeneric,new(){...}

 第一行,指定T,必须继承SuperGeneric类,而且必须有一个公共无参的构造方法

第二行,分别用where 指定了T1,T2的约束,对于多个泛型类型,添加约束就要这样写,一个where对应一个泛型类型

第三行,是个要注意的点,泛型约束要定义在类继承语法的后面,这是必要的,因为放在where后会引起歧义

约束类型有以下几个:

注意,new()必须放在约束的最后

泛型在继承中需要注意的点:

    子类继承泛型,子类泛型的约束不能大于父类约束或者与父类约束冲突,比如父类泛型约束是值类型,那么子类的泛型约束就不能设置为引用类型。

如果继承泛型类,那么子类要么也是泛型类,要么显示指定父类泛型的类型,以下代码是错误的:

class ChildClass:Ilist<T>{...}//编译不通过,使用时无法确定T的类型

可以显示设置,或者设置子类为泛型:

class ChildClass:Ilist<string>{...}
class ChildClass<T>:Ilist<T>{...}

这是我的公众号,获取最新文章,请关注此号

C# 泛型Generic的更多相关文章

  1. Java - 泛型 ( Generic )

    Java - 泛型 ( Generic )     > 泛型的特点         > 解决元素存储的安全性问题         > 解决获取数据元素时,需要类型强转的问题     ...

  2. Java之集合初探(二)Iterator(迭代器),collections,打包/解包(装箱拆箱),泛型(Generic),comparable接口

    Iterator(迭代器) 所有实现了Collection接口的容器都有一个iterator方法, 用来返回一个实现了Iterator接口的对象 Iterator对象称作迭代器, 用来方便的实现对容器 ...

  3. 谈一谈从 Delphi 2009 之后就支援的重要功能 – 泛型 (Generic)

    前言 在C++的语言基础当中,除了物件导向.事件驱动的概念之外,模版设计(Template)也是非常重要的一环.然而,C++的开发人员能够善用模版设计的并不多.模版设计这个好物,一般还有一个名称,就是 ...

  4. JAVA中的泛型(Generic)

    Java泛型(Generic)简介 泛型是jdk1.5版本以后推出来的,表示类型参数化,让java能更具有动态性一些,让类型能变成参数传递. 要我自己感觉的话,泛型本身没啥用,跟反射在一起用,就体现出 ...

  5. Dephi泛型generic的应用

    Dephi泛型generic的应用   泛型在C++, C#中已有广泛应用,Delphi自2009版本也引入泛型,典型的应用如TList,TDictionary.如果你熟悉C#,其用法十分类似. 比如 ...

  6. Java基础之Comparable接口, Collections类,Iterator接口,泛型(Generic)

    一.Comparable接口, Collections类 List的常用算法: sort(List); 排序,如果需要对自定义的类进行排序, 那就必须要让其实现Comparable接口, 实现比较两个 ...

  7. Java自学-集合框架 泛型Generic

    ArrayList上使用泛型 步骤 1 : 泛型 Generic 不指定泛型的容器,可以存放任何类型的元素 指定了泛型的容器,只能存放指定类型的元素以及其子类 package property; pu ...

  8. C#泛型(Generic)

    一.什么是泛型 泛型(Generic)是C#语言2.0.通用语言运行时(CLR)2.0..NET Framework2.0推出来的新特性. 泛型为.NET框架引入类型参数(Type Parameter ...

  9. .NET知识梳理——1.泛型Generic

    1. 泛型Generic 1.1        引入泛型:延迟声明 泛型方法声明时,并未写死类型,在调用的时候再指定类型. 延迟声明:推迟一切可以推迟的. 1.2        如何声明和使用泛型 泛 ...

随机推荐

  1. IDEA如何像ecplise一样添加jar包?

    以前使用ecplise开发代码,现在换成IDEA,有很多操作都不习惯,比如添加jar包.网上可以找到IDEA好几种添加jar包的方法,这里主要介绍在用IDEA开发时如何像ecplise一样添加jar包 ...

  2. springboot集成swagger实战(基础版)

    1. 前言说明 本文主要介绍springboot整合swagger的全过程,从开始的swagger到Knife4j的进阶之路:Knife4j是swagger-bootstarp-ui的升级版,包括一些 ...

  3. 【Spring Cloud & Alibaba全栈开源项目实战】:SpringBoot整合ELK实现分布式登录日志收集和统计

    一. 前言 其实早前就想计划出这篇文章,但是最近主要精力在完善微服务.系统权限设计.微信小程序和管理前端的功能,不过好在有群里小伙伴的一起帮忙反馈问题,基础版的功能已经差不多,也在此谢过,希望今后大家 ...

  4. 学习C#第一天

    学习C#第一天 先是了解了VS 2019编辑器的基本使用 安装Visual Studio https://mp.weixin.qq.com/s?__biz=MzU0MTg5NDkzNA==&m ...

  5. Etcd常用运维命令

    目录 常用命令 常见操作 如何缩容? 如何扩容? 数据目录丢失或被误删除,节点启动失败或者加入集群报错? 操作步骤 操作步骤不正确的各种常见错误日志 常用命令 #查看集群member情况 etcdct ...

  6. 扩展中国剩余定理(EXCRT)学习笔记

    扩展中国剩余定理(EXCRT)学习笔记 用途 求解同余方程组 \(\begin{cases}x\equiv c_{1}\left( mod\ m_{1}\right) \\ x\equiv c_{2} ...

  7. 从零搭建一个IdentityServer——会话管理与登出

    在上一篇文章中我们介绍了单页应用是如何使用IdentityServer完成身份验证的,并且在讲到静默登录以及会话监听的时候都提到会话(Session)这一概念,会话指的是用户与系统之间交互过程,反过来 ...

  8. 翻译:《实用的Python编程》08_02_Logging

    目录 | 上一节 (8.1 测试) | 下一节 (8.3 调试) 8.2 日志 本节对日志模块(logging module)进行简单的介绍. logging 模块 logging 模块是用于记录诊断 ...

  9. Redis初学

    1. redis     1. 概念     2. 下载安装     3. 命令操作         1. 数据结构     4. 持久化操作     5. 使用Java客户端操作redis Redi ...

  10. Mysql无法通过临时密码访问

    在Linux上安装Mysql: [步骤一]:将mysql的安装文件上传到Linux的服务器. [步骤二]:安装MYSQL服务端 [步骤三]:安装MYSQL客户端 我在步骤三遇到了问题,所以直接从步骤三 ...