泛型(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. 使用Webpack构建多页面程序

    使用webpack搭建单页面程序十分常见,但在实际开发中我们可能还会有开发多页面程序的需求,因此我研究了一下如何使用webpack搭建多页面程序. 原理 将每个页面所在的文件夹都看作是一个单独的单页面 ...

  2. 在用free()函数释放指针内存时为何要将其指针置空

    在通过free()函数释放指针内存之后讲其指针置空,这样可以避免后面的程序对与该指针非法性的判断所造成的程序崩溃问题.释放空间,指针的值并没有改变,无法直接通过指针自身来进行判断空间是否已经被释放,将 ...

  3. 什么是IPFS集群?IPFS集群有什么好处?

    IPFS作为区块链不多的创新技术,其热度一直居高不下.IPFS挖矿效率最高的就是集群结构,那么今天我就带着大家了解IPFS的集群挖矿. 什么是集群挖矿?   集群(cluster)就是计算机集群,指在 ...

  4. java例题_09 1000以内的完全数

    1 /*9 [程序 9 求完数] 2 题目:一个数如果恰好等于它的所有因子之和,这个数就称为"完数". 3 例如 6=1+2+3.编程找出 1000 以内的所有完数. 4 */ 5 ...

  5. maven 打包和构建的Linux命令(mvn)

    maven 打包构建相关命令 命令 mvn clean package 依次执行clean.resources.compile.testResources.testCompile.test.jar(打 ...

  6. 第16 章 : 深入理解 etcd:基于原理解析

    深入理解 etcd:基于原理解析 本文将主要分享以下三方面的内容: 第一部分,会为大家介绍 etcd 项目发展的整个历程,从诞生至今 etcd 经历的那些重要的时刻: 第二部分,会为大家介绍 etcd ...

  7. 记录给树莓派刷Raspberry Pi OS(Raspbian)系统的配置流程

    准备材料 树莓派(一定要贴散热片,最好再加个小风扇) TF内存卡 (记得选传输规范为Class10标准的) 读卡器 电脑(这里我使用的电脑是Windows系统,其它系统可能与下面的步骤有出入,还望悉知 ...

  8. (原创)高DPI适配经验系列:(二)按DPI范围适配

    一.前言 一个软件,往往会用到位图资源,比如图标.图片.水晶按钮等. 在使用了位图资源后,就不能对任意DPI都进行适配,因为这样适配的代价太大了. 像Win10的缩放比例可以由100%-500%,如果 ...

  9. day-9 xctf-int_overflow

    xctf-int_overflow 题目传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&am ...

  10. 0ctf_2017_babyheap

    0ctf_2017_babyheap 首先检查一下保护 IDA 分析好的代码如下 首先申请了一块内存地址用来存放结构体数组,地址随机. 堆题常见的几个功能.我们来看看add 这里申请内存用的是call ...