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://baike.baidu.com/link?url=yFJngSobJrtYldbg0LxptUVMNp47qTEsvDhCafylOjpkYpZKyIUCfwzmiTKRbTkEoEZl1MkNXwO3pp2TpaS9_JjYhL7UXvfdkw8SRUV1enq

  http://blog.jobbole.com/87974/

  http://blog.jobbole.com/87980/

  

NET Framework 的泛型的更多相关文章

  1. Entity Framework 高性能 泛型缓存+动态Lambda

    前言:自学CSharp挺长时间的了,这是我第一编博客,跟大家分享一下.如有不足地方请多多包涵,也欢迎大家提出更好的意见,下面开始进入正题. 一.泛型缓存 1.概念:1.泛型(泛型也是一种推断类型,从而 ...

  2. C# 语法特性 - 泛型(C#2.0)

    泛型将 类型参数 的概念引入了 .NET Framework. 泛型主要有两个优点: 1.编译时可以保证类型安全. 2.不用做类型转换,获得一定的性能提升. 泛型方法.泛型委托.泛型接口 除了泛型类之 ...

  3. C#基础知识简单梳理

    本文是转发博友的总结,方便自己以后随时温习: 1.值类型和引用类型 1.1堆和栈 简单的说值类型存放在堆栈上面,引用类型的数据存放在托管堆上面(它的引用地址却存放在堆栈上面)! 栈:它是一个内存数组, ...

  4. 转载文章----C#基础概念

    转载地址:http://www.cnblogs.com/zhouzhou-aspnet/articles/2591596.html 1.值类型和引用类型 1.1堆和栈 简单的说值类型存放在堆栈上面,引 ...

  5. ASP.NET MVC 应用提速的十种方法

    [编者按]本文作者为 DZone 社区的最具价值博主(MVB) Jonathan Danylko,主要介绍为 ASP.NET MVC 应用提速的十种方法.由国内 ITOM 管理平台 OneAPM 编译 ...

  6. windows类书的学习心得

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  7. 【C#】详解C#委托

    目录结构: contents structure [+] 委托语法 泛型委托 委托链 lambda表达式 揭秘委托 类库中的委托 委托和反射 1.委托语法 本文会详细阐述委托的使用,以及实现,想必读者 ...

  8. c#知识梳理

    转:http://www.cnblogs.com/zhouzhou-aspnet/articles/2591596.html 本文是一个菜鸟所写,本文面向的人群就是像我这样的小菜鸟,工作一年也辛辛苦苦 ...

  9. C#基础知识 (转)

    https://www.cnblogs.com/zhouzhou-aspnet/articles/2591596.html(原文地址) 本文是一个菜鸟所写,本文面向的人群就是像我这样的小菜鸟,工作一年 ...

随机推荐

  1. sql 查找所有已经分配部门的员工

    查找所有已经分配部门的员工的last_name和first_nameCREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL,`dept_no` char( ...

  2. java有包名的调用没有包名的类,用反射

    没有包名,就是说在根目录,普通项目就是在src下,maven项目就是在src/java目录下 // 通过全类名,没有包名就直接是类名,有包名就要加上包名,比如:com.xiaostudy.TLStri ...

  3. 在 Mac 系统下安装 PyCharm 的方法

    首先,进入 PyCharm 的官网,PyCharm: Python IDE for Professional Developers by JetBrains. 如上图所示,直接点击DOWNLOAD N ...

  4. ubuntu16.04+cuda9.0_cudnn7.5+tensorflow-gpu==1.12.0

    1.查找可用的tensorflow源,该命令运行后终端会输出所有可用的源 anaconda search -t conda tensorflow 2.这里name是上一步中输出源的tensorflow ...

  5. docker使用1

    1. 安装 可以参考https://www.runoob.com/docker/centos-docker-install.html 注意linux版本是centos7.6 2. docker启动,停 ...

  6. 如何在运行时更改JMeter的负载

    在某些情况下,能够在不停止测试的情况下更改性能测试产生的负载是有用的或必要的.这可以通过使用Apache JMeter™的恒定吞吐量计时器和Beanshell服务器来完成.在这篇文章中,我们将介绍如何 ...

  7. AttributeError: module 'select' has no attribute 'epoll'

    AttributeError: module 'select' has no attribute 'epoll'   今天乌班图镜像莫名其妙损坏了,只好用Windows写并发TCP服务器的代码.运行后 ...

  8. python基础_MySQL的bigint类型

    bigint支持的数字的大小范围为:19位,存电话号码.有符号范围:-9223372036854775808 到 9223372036854775807 int支持的数字范围为:10位,有符号范围:- ...

  9. 原子类 Atomic

    @Testpublic void testAtomicBoolean() { AtomicBoolean atomicBoolean = new AtomicBoolean(); boolean b ...

  10. Spark 系列(二)—— Spark开发环境搭建

    一.安装Spark 1.1 下载并解压 官方下载地址:http://spark.apache.org/downloads.html ,选择 Spark 版本和对应的 Hadoop 版本后再下载: 解压 ...