C# 泛型分析

1、object类型是一切类型的父类。

2、通过继承,子类拥有父类的一切属性和行为,任何父类出现的地方,都可以用子类来代替。

但是上面object类型的方法又会带来另外一个问题:装箱和拆箱,会损耗程序的性能。

在泛型类型或方法定义中,类型参数是在其实例化泛型类型的一个变量时,客户端指定的特定类型的占位符。 泛型类( GenericList)无法按原样使用,因为它不是真正的类型;它更像是类型的蓝图。 若要使用 GenericList,客户端代码必须通过指定尖括号内的类型参数来声明并实例化构造类型。 此特定类的类型参数可以是编译器可识别的任何类型。 可创建任意数量的构造类型实例,其中每个使用不同的类型参数。

为什么泛型可以解决上面的问题呢?

泛型是延迟声明的:即定义的时候没有指定具体的参数类型,把参数类型的声明推迟到了调用的时候才指定参数类型。 延迟思想在程序架构设计的时候很受欢迎。例如:分布式缓存队列、EF的延迟加载等等。

泛型究竟是如何工作的呢?

控制台程序最终会编译成一个exe程序,exe被点击的时候,会经过JIT(即时编译器)的编译,最终生成二进制代码,才能被计算机执行。泛型加入到语法以后,VS自带的编译器又做了升级,升级之后编译时遇到泛型,会做特殊的处理:生成占位符。再次经过JIT编译的时候,会把上面编译生成的占位符替换成具体的数据类型。

泛型约束总共有五种。

| 约束 | s说明 | | ------------- | ------------------------------------------------------------ | | T:结构 | 类型参数必须是值类型 | | T:类 | 类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。 | | T:new() | 类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。 | | T:<基类名> | 类型参数必须是指定的基类或派生自指定的基类。 | | T:<接口名称> | 类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。 |

1、基类约束

上面打印的方法约束T类型必须是People类型。

注意:

基类约束时,基类不能是密封类,即不能是sealed类。sealed类表示该类不能被继承,在这里用作约束就无任何意义,因为sealed类没有子类。

2、接口约束

3、引用类型约束 class

引用类型约束保证T一定是引用类型的。

4、值类型约束 struct

值类型约束保证T一定是值类型的。

5、无参数构造函数约束 new()

相关推荐
萧瑟余晖1 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才1 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio2 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
萧瑟余晖3 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
离陌在学C#5 小时前
C# 重载与重写:深入理解面向对象编程的核心概念
java·c#
洛阳泰山5 小时前
AI 应用层被 Python 卷成红海,为什么我偏要用 Java 造一个 RAG + 工作流引擎?
java·人工智能·后端
二十雨辰6 小时前
[Java]-Spring面试题
java·开发语言
老马历写记6 小时前
Maven POM 依赖管理总结
java·maven·system·pom·optional
古法安卓6 小时前
Android-车机 GNSS 定位数据接收问题排查
android·java·android studio
_oP_i6 小时前
python 后缀 mjs文件
开发语言·python