1、泛型是什么

泛型的就是“通用类型”,它可以代替任何的数据类型,使类型参数化,从而达到只实现一个方法就可以操作多种数据类型的目的。

2、为什么使用泛型

举一个比较两个数大小的例子:

以上例子实现int类型数据的大小比较是完全没有问题的,但是如果客户现在增加需求“又可以实现两个字符串大小的比较”,此时就不得不在类中再添加一个比较字符串大小的方法了:

如果客户现在还增加需求,要求实现浮点型的比较,那么工作量就更大了,不得不再次修改代码,显然这不是我们想看到的,两个方法中有大部分代码是类似的,所以微软提出了一个激动人心的特性--泛型,他使得类型可以被参数化。

where语句是类型参数的约束它用来使参数可以适用于CompareTo方法。

向泛型中加入元素的效率远比非泛型数组高,原因是非泛型rrayList的Add(Object value)方法中,参数为object类型,当把int参数i传入方法时,会发生装箱操作,从而导致性能的损失,使运行的时间变得更长。

泛型可以保证类型安全,当你向int类型数组中添加string类型的值的时候,会造成“无法从string类型转换为int类型”的错误,因为你用int类型初始化了泛型类型。

3、泛型参数解析

1、类型参数

根据泛型类型参数是否已经提供实际类型,可分为未绑定的泛型和已构造的泛型,如果没有给泛型提供实际类型,此时的泛型成为未绑定的泛型;如果已指定了实际类型作为参数,此时的泛型成为已构造泛型。

已构造泛型又称为开放泛型和密封泛型。开放泛型指包含类型参数的泛型,所有未绑定的类型都属于开放类型;而封闭类型指已经为每个参数都指定了实际数据类型的泛型。

2、泛型中的静态字段和静态函数问题

对于非泛型类,定义了一个静态字段,不管是创建了多少个该类的实例,也不管从该类派生出多少个实例,都只存在一个字段,但是每个封闭的泛型类型中都有仅属于他自己的静态字段。

这是因为,在使用实际类型参数代替泛型参数时,编译器会根据不同的类型参数,从新生成类型。

对于静态构造函数,道理也是如此,每个封闭的泛型类型都有一个静态构造函数,这里就不一一演示。

3、类型参数的推断

写泛型的时候可以省略掉“<>”,具体实际类型交由编译器自行推断。

编译器会根据传入实参的类型判断实际类型参数。

4、类型参数的约束

(1)引用类型约束

表示形式:T:class;

以上代码中,where T:Stream告诉编译器:传入的类型实参必须是System.IO.Stream,或者是从Stream派生出的一个类型。

如果一个类型参数没有指定约束,那么默认T为System.Object类型。但若在代码中显式指定了System.Object约束,则编译器会报错:约束不能是特殊类Object。

(2)值类型约束

表现形式:T:struct

它确保传递的类型实参是值类型(包含枚举),但这里的值类型不包括可空类型。

所有的值类型都有一个公共的无参构造函数,因此new T()是没有问题的,但是引用类型没有公共的无参构造函数,如果不对T进行约束,或约束为引用类型,则上边代码就会报错。

(3)构造函数类型约束

表现形式:T:new();

如果类型参数有多个约束,则次约束必须最后指定,构造函数类型约束确保制定的类型有一个公共无参的构造函数的非抽象类型。

(4)转换类型约束

表现形式:T:基类名、T:接口名或T:U

T:基类名确保制定的类型实参必须是基类或派生自基类的子类;

T:接口名确保制定的类型实参必须会接口或已经实现接口的类;

T:U确保T提供的是后面的类型实参或后面类型实参子类;

(5)组合约束

不同种类的约束合并到一起的约束,这里需要注意,没有任何一种类型既是引用类型,又是值类型,这两种约束不能同时使用。如果同时存在多个转换类型约束,其中有一个是类,那么类必须放在接口前面。不同的类型参数有不同的约束,但是每种类型参数必须使用单独的where关键字分开:

当然,C#中泛型的知识还有很多的应用场景,有兴趣的可以去找一些书籍看看,收获肯定不少,这里介绍只是让大家有一个比较直观的认识,看完后能够对泛型有一个比较直观的了解,懂得它有什么用,以及怎么去使用就行,更加高级的应用场景往后会慢慢分享,谢谢大家支持。

C#之使类型参数--泛型的更多相关文章

  1. Scala类型参数(泛型)与隐式转换

    package com.yz9 import org.junit.Test import scala.collection.mutable.ListBuffer class test { @Test ...

  2. Java泛型中的类型参数和通配符类型

    类型参数 泛型有三种实现方式,分别是泛型接口.泛型类.泛型方法,下面通过泛型方法来介绍什么是类型参数. 泛型方法声明方式:访问修饰符 <T,K,S...> 返回类型 方法名(方法参数){方 ...

  3. Java:泛型基础

    泛型 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚很多! 解决这种限制的 ...

  4. Java泛型

    什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个 ...

  5. 泛型(Generics)

    Framework类库中的泛型 泛型可以使代码重用,提高开发效率 CLR允许在引用类型.值类型或接口中定义泛型方法: CLR允许创建泛型引用类型.泛型值类型(枚举不允许创建).泛型委托类型和泛型接口类 ...

  6. java 深入技术五 (泛型)

    1.泛型概述 泛型的本质:参数化类型 定义 Object obj=new Object();//并不是所有类都可以使用泛型 List <String> list=new ArrayList ...

  7. .NET 泛型

    泛型      泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候.例如,通过 ...

  8. 30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法

    一:值类型/引用类型的区别      值类型主要包括简单类型,枚举类型,和结构体类型等,值类型的实例通常被分配在线程堆栈上面变量保存的内容是实例数据本身.引用类型被分配在托管堆上,变量保存的是地址.引 ...

  9. Java泛型总结

    1. 什么是泛型?泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的 ...

随机推荐

  1. appium----【已解决】【Mac】ANDROID_HOME的环境变量配置

    在搭建appium的环境时,提示Android_home的环境没有配置,经过一会的奋战终于解决,再次记录下解决方式. 1.安装android-sdk-macosx 下载路径:http://down.t ...

  2. Python安装和配置

    在我厂呆了快一年,终于等来了转岗机会,而且现在正在调动到新成立的AI战略部门,心里无比欣喜和激动.自己作为一个小白,终于有机会踏入AI领域,离自己的梦想更近了一步,个人感到无比的幸运,仿佛天生就有上天 ...

  3. nginx安装部署(支持https)

    1      安装环境准备 1.1   准备环境清单 以下是基本环境清单列表: 软件名称 版本号 说明信息 Linux CentOS 6.7 部署机器只需为Linux系统即可,无严格要求 1.2   ...

  4. 原型模式--java代码实现

    原型模式 原型模式,属于对象创建型模式中的一种.通过复制原型对象的方法来创建一个对象实例,且该对象与原对象有相同的数据结构和值.类似我们在备份数据库信息的时候,将数据库中表的结构和数据的一同备份,生成 ...

  5. Vue.js-09:第九章 - 组件基础再探(data、props)

    一.前言 在上一章的学习中,我们学习了 Vue 中组件的基础知识,知道了什么是组件,以及如何创建一个全局/局部组件.不知道你是否记得,在上一章中,我们提到组件是一个可以复用的 Vue 实例,它与 Vu ...

  6. 使用vue开发项目需要注意的问题和可能踩到的坑

    最近,在公司给一些刚刚使用vue进行开发的同学做了一次分享, 其中包括一些vue开发中需要注意的点, 以及一些可能会踩到的坑.具体内容如下: 一.生命钩子使用需要注意的地方 1.beforeCreat ...

  7. SpringBoot自动配置原理

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面Spring的文章(以学习的顺序排好): S ...

  8. Windows代码,添加一个节,以及RVA跟FOA互相转化,以及内存文件对齐代码.

    / 1.修改文件头节个数 +1 2.修改ImageBase 3.遍历节表,拷贝最后一个节表到下面 4.修改节的虚拟大小(节表.virtualSize) 5.修改节的虚拟地址(RVA 节表.virtua ...

  9. 文件进行MD5计算

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. CSS入门知识汇总

    1.CSS认识 在谈论CSS的概念之前,我们先说一说web标准的目的——其在于创建一个统一的用于web表现层的技术标准,以便通过不同浏览器或终端设备向最终用户展示信息内容.一个网页的呈现是由三部分组成 ...