NET Framework 的泛型
NET Framework 的泛型
开放类型和封闭类型
具有泛型类型参数的类型对象还是一个类型, CLR内部依旧和其他的对象类型一样创建一个内部类型对象, 那么这种具有泛型类型参数的类型称之为开放类型,开放类型不能进行构造任何的实例.
当泛型类型参数是一个实参时,那么所有的类型实参传递的都是实际的数据类型了,这种类型称之为 封闭类型,封闭类型是允许构造实例对象的。
泛型接口
泛型的主要作用就是定义泛型的引用类型和值类型,在CLR中,对于泛型接口的支持也是很重要的,因为这样更有益与程序的扩展性, 另外一点如果没有泛型接口我们每次使用非泛型接口时都会进行装箱操作(例如: IComparable),并且会失去编译时的安全性(因为它是非泛型的,较之泛型的好处之一).
那么CLR提供了对于泛型接口的支持,对于引用类型和值类型可以通过制定实参的方式来实现泛型接口,同时也可以保持未指定状态来实现一个泛型接口( 接受者也可以是泛型 , 可以在后期进行指定类型)
泛型方法
泛型可以是类,结构,接口,在这些泛型类型中定义的方法都可以叫做泛型方法,都可以引用由泛型类型本身指定的一个类型参数,泛型方法顾名思义,首先它是一个方法,只不过这个方法的返回值,参数可能是泛型的。
泛型约束
约束也可以理解为是一种规则,意思就是我们所编写的所有泛型,你在调用的时候,应该给我传输哪些类型的实参。
1.主要约束(引用类型约束):
主要约束表示的是 : 我们在指定一个引用类型约束时,那么一个指定的类型实参要么是与约束类型相同的类型,要么是从约束类型派生的一个类型
struct Generic<T>(T t1) where : class
2 主要约束(值类型约束)
很明显,值类型约束的话,就是将 约束条件指定为 Struct
public class ConstraintOfStruct <T> where T : struct
{
public T result()
{
return new T();
}
}
在代码中,我们最后返回的是new T(),这个是没有问题的,因为我们已经可以肯定T就是值类型,所有的值类型都有一个隐式的构造函数,那么如果我们将 约束条件改为 class的话,那么就会出异常,因为不是所有的引用类型都可以实例化.
3 构造函数类型约束
构造函数类型约束表示为 T : new(),这个约束必须为所有的类型参数的最后一个约束,它用于检查类型实参是否有一个可用于创建类型实例的无参构造函数,这一点比较适用于所有的值类型,所有的没有显式声明构造函数的非静态、非抽象类,所有显式声明了一个公共无参构造函数的非抽象类。
public T CreateInatance<T >() where T : new()
{
return new T();
}
在方法createInstance中,要求我们必须传入一个无参的构造函数,例如:我们可以传入 object,struct,stream等,但是不能传入 string,Directory等.
4 接口约束
接口约束的一个好处就是我们可以指定多个接口,但是只能指定一个类
class ConstraintOfStruct <T> where T : class,IEquatable <T> ,IComparable<T>
{
}
5 组合约束 :
组合约束就是指定多个约束条件在上一个约束中我们已经看到了 ,更详细的如下 :
class Sample<T> where T : class ,IDisposable,new(){}
class Sample<T> where T : struct,IDisposable{}
class Sample<T,U> where T : Stream where U : IDisposable{}
class Sample<T> where T : class ,struct
泛型类型构造器
泛型的构造器不需要添加类型参数来与类的声明一致
interface IPiar < T> { } class Pair < T> : IPiar< T >
{
public Pair(T first,T second)
{
}
}
参考:
http://blog.jobbole.com/87974/
http://blog.jobbole.com/87980/
NET Framework 的泛型的更多相关文章
- Entity Framework 高性能 泛型缓存+动态Lambda
前言:自学CSharp挺长时间的了,这是我第一编博客,跟大家分享一下.如有不足地方请多多包涵,也欢迎大家提出更好的意见,下面开始进入正题. 一.泛型缓存 1.概念:1.泛型(泛型也是一种推断类型,从而 ...
- C# 语法特性 - 泛型(C#2.0)
泛型将 类型参数 的概念引入了 .NET Framework. 泛型主要有两个优点: 1.编译时可以保证类型安全. 2.不用做类型转换,获得一定的性能提升. 泛型方法.泛型委托.泛型接口 除了泛型类之 ...
- C#基础知识简单梳理
本文是转发博友的总结,方便自己以后随时温习: 1.值类型和引用类型 1.1堆和栈 简单的说值类型存放在堆栈上面,引用类型的数据存放在托管堆上面(它的引用地址却存放在堆栈上面)! 栈:它是一个内存数组, ...
- 转载文章----C#基础概念
转载地址:http://www.cnblogs.com/zhouzhou-aspnet/articles/2591596.html 1.值类型和引用类型 1.1堆和栈 简单的说值类型存放在堆栈上面,引 ...
- ASP.NET MVC 应用提速的十种方法
[编者按]本文作者为 DZone 社区的最具价值博主(MVB) Jonathan Danylko,主要介绍为 ASP.NET MVC 应用提速的十种方法.由国内 ITOM 管理平台 OneAPM 编译 ...
- windows类书的学习心得
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...
- 【C#】详解C#委托
目录结构: contents structure [+] 委托语法 泛型委托 委托链 lambda表达式 揭秘委托 类库中的委托 委托和反射 1.委托语法 本文会详细阐述委托的使用,以及实现,想必读者 ...
- c#知识梳理
转:http://www.cnblogs.com/zhouzhou-aspnet/articles/2591596.html 本文是一个菜鸟所写,本文面向的人群就是像我这样的小菜鸟,工作一年也辛辛苦苦 ...
- C#基础知识 (转)
https://www.cnblogs.com/zhouzhou-aspnet/articles/2591596.html(原文地址) 本文是一个菜鸟所写,本文面向的人群就是像我这样的小菜鸟,工作一年 ...
随机推荐
- C/C++ 面试-面向对象的特性
面向对象的三大特性 此文只是简单介绍一下三大特性 详细介绍在: 封装:http://www.cnblogs.com/52why/p/7631381.html 继承:http://www.cnblo ...
- php_MVC实现步骤二
2.match_split 显示逻辑相分离 将功能强制分成两个部分,显示html文件,和逻辑PHP文件: 要求浏览器请求负责功能的PHP逻辑文件: 该PHP逻辑文件,对需要的显示内容进行载入. 逻辑P ...
- /x86_64-linux-gnu/libSM.so: undefined reference to `uuid_generate@UUID_1.0'错误
在编译PCL的时候总是报错,其他人都没问题 后来发现是我cmakePCL的时候,QT引用的是anaconda里的qt,把这个一改果然没问题了,耽误了一天时间. 感谢stack上这位老铁
- log4j测试示例
引入依赖 <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId> ...
- [十一集训] Day1 (2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018))
A Altruistic Amphibians 原题 题目大意: n只青蛙在高度为d的井中,每只有跳跃距离.重量和高度,每只青蛙可以借助跳到别的青蛙的背上而跳出井,每只青蛙能承受的最大重量是自身重量, ...
- 1.jvm思维导图
点击图片可查看高清图
- python学习-66 面向对象3 - 多态
多态 1.什么是多态 由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同. 举例: class H2O: def __init__(self,type,tem): self.type = ty ...
- Altium Designer 复制报错-奇怪的问题解决办法
之前AD画原理图复制元件正常使用,今天使用时复制弹出了错误.很是诧异! 各种搜索查找问题,发现或许是因为前一段时间把,电脑上的所有打印机都删除了导致的. 就安装了一个打印机. 再复制,就不报错了. 或 ...
- jenkins配合dockerfile部署项目
前言 本节需要对jenkinsfile有点了解,对dockerfile有点了解,对shell有点了解,对docker有点了解 执行流程 jenkins拉取代码仓库中的代码 jenkins执行jenki ...
- ubuntu配置Selenium+Chromedriver
1.下载并安装最新的Google Chrome版本执行如下命令: wget https://dl.google.com/linux/direct/google-chrome-stable_curren ...