吃午饭前继上篇泛型再写一篇关于泛型的文章,虽然总是被博客园移出首页,文章不精确实是大问题啊,会再接再厉的。进入正题。

  先来说下泛型约束。当我们在使用泛型的时候通常会希望使用泛型实参时,参数能具备某一些特性,这时"泛型约束"来了,它能帮助我们在传入泛型参数,该参数要实现先前指定的约束。有4种约束可用,如下:

  1. 引用类型约束:确保使用的类型参数是引用类型(T:class,且必须是类型参数指定的第一个约束),类型实参任何类、接口、数组、委托、或者已知是引用类型的另一个类型参数。
  2. 值类型约束:表示成(T:struct),可以确保使用的实参是值类型,包括枚举(enums),但是它将可空类型排队在外。
  3. 构造类型约束:表示成(T:new()),必须是约束的最后一个约束,它检查类型是否具有一个可用于创建实例的无参构造函数。
  4. 转换类型约束:允许你指定另一个类型,类型参数可以通过一致性引用或隐式转换或装箱转换转换为该类型。
 public struct DoDo<T> where T : class
{}
public class BiBi<T> where T : struct
{}
public struct CoCo<T> where T : new()
{}
public struct DkDk<T> where T : System.Data.IDbConnection
{}

  上述四个分别对应四种类型约束(仅仅在单个使用),下面来说下在组合使用的情况。

  组合使用有两点要注意:

  1. 如果存在多个轮换类型约束,并且其中一个是类,那么它应该出现在接口的前面,不能多次指定同一个接口。
  2. 当包含多个类型参数时,每一个类型约束都单独使用一个where。
 //不能同时指定类型参数既是引用类型又是值类型
//public struct DoDo<T> where T : class, struct
//{} public class BiBi<T> where T : Stream, new()
{} //使用构造类型约束,new()要放在最后
//public class LiLi<T> where T : new(), Stream
//{} public struct CoCo<T> where T : class, IDisposable , new()
{} //如下一个约束是类,要放在接口的前面
//public struct FeFe<T> where T : IDisposable, class, new()
//{}

  使用泛型约束知识都在上面了,更多的去理解和消化。在使用泛型方法时,让编译器是推断能让我们的代码更简短,但可读性可能不高。

  ------------------------------------------------------------------------------------------------------------------------------------------

  Point 1 关于静态字段和静态构造方法,每一个封闭类型有一个静态字段,如果有的话

 StaticConstraint<int> intStatic = new StaticConstraint<int>();
StaticConstraint<int>.StaticValue = "int"; StaticConstraint<double> doubleStatic = new StaticConstraint<double>();
StaticConstraint<double>.StaticValue = "double"; StaticConstraint<char> charStatic = new StaticConstraint<char>();
StaticConstraint<char>.StaticValue = "char";

  Point 2 使用typeof获取类型

  typeof可通过两种方式作用于泛型类型,一种用来获取未绑定泛型类型,一种用来获取特定的已构造类型。前一种需要提供泛型的名称,去除所有类型参数的名称,但要保留逗号,后一种需要采取与声明泛型类型变量相同的方式指定类型参数即可。

  

 static void GetTypeOfConstraint<X>()
{
//获取未绑定泛型类型
Console.WriteLine(typeof(X));
Console.WriteLine(typeof(List<>));
Console.WriteLine(typeof(Dictionary<,>)); //获取已构造类型
Console.WriteLine(typeof(List<int>));
Console.WriteLine(typeof(Dictionary<int, double>));
}

  请斧正。

06.C#泛型约束和高级泛型(三章3.3-3.4)的更多相关文章

  1. MySQL高级第三章——查询截取分析

    一.查询分析 1.永远小表驱动大表 使用小的数据集驱动大的数据集. //复习 EXISTS 的知识:SELECT ... FROM tb WHERE EXISTS (subquery) 是因为前后数据 ...

  2. C#高级语法之泛型、泛型约束,类型安全、逆变和协变(思想原理)

    一.为什么使用泛型? 泛型其实就是一个不确定的类型,可以用在类和方法上,泛型在声明期间没有明确的定义类型,编译完成之后会生成一个占位符,只有在调用者调用时,传入指定的类型,才会用确切的类型将占位符替换 ...

  3. 【黑金原创教程】【TimeQuest】【第三章】TimeQuest 扫盲文

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

  4. C# 泛型约束

    一.泛型简介1.1泛型通过使用泛型,可以创建这样的类.接口和方法,它们以一种类型安全的工作方式操作各种数据.本质上,术语“泛型”指的是“参数化类型”(parameterized types).参数化类 ...

  5. 07.C#泛型的限制和可空类型的简单说明(三章3.5-四章4.1)

    自己在写文章的同时,也是在学习,对于书中的语句很多其实没有太好的理解,读一本书,要消化!!!三章都是讲泛型的,最后写一下泛型的限制,对于本章学习的完结,one end,one begin. 看下面的代 ...

  6. 转:C# 泛型编程之泛型类、泛型方法、泛型约束

    C# 泛型编程之泛型类.泛型方法.泛型约束 分类: asp.net c#2012-08-07 17:36 5998人阅读 评论(0) 收藏 举报 c#编程classobject编译器struct 泛型 ...

  7. 用LinQ扩展方法,泛型扩展方法,实现自定义验证字符是否空、对象是否为null,及泛型约束使用,Action的使用

    一.Linq扩展方法 1.扩展方法必须是静态方法.扩展方法所在的类必须是静态类 2.扩展方法里面的参数必须制定this关键字,紧跟需要扩展的类型,如下: 二.泛型约束 1.使用泛型的原因,是在不知道需 ...

  8. C# 泛型约束 xxx Where T:约束(二)

    泛型是什么? 通过上篇的实例  C# 泛型约束 xxx<T> Where T:约束(一),我们对泛型有一定的认识. 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型,泛型编程 ...

  9. C# 泛型编程之泛型类、泛型方法、泛型约束

    来自Hauk的文章 C# 泛型编程之泛型类.泛型方法.泛型约束 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型. 泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为 ...

随机推荐

  1. 利用Keydown事件阻止用户输入

    先了解下各事件的区别 keydown:在控件有焦点的情况下按下键时发生 keypress:在控件有焦点的情况下按下键时发生 keyup:   在控件有焦点的情况下释放键时发生 意义 keypress主 ...

  2. Uva-11374-Airport Express

    A - Airport Express Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Appoi ...

  3. LinuxI2C核心、总线驱动与设备驱动

    I2C体系结构分为三个部分:I2C核心.总线驱动.设备驱动 I2C核心: I2C核心提供了一组不依赖硬件的接口函数,I2C总线驱动和设备驱动之间依赖于I2C核心作为纽带 (1)增加/删除i2c_ada ...

  4. 伪多项式时间算法Pseudo-polynomial Algorithms-----geeksforGeek 翻译

    原创翻译加学习笔记,方便国人学习算法知识! 原文链接http://www.geeksforgeeks.org/pseudo-polynomial-in-algorithms/ 什么是伪多项式? 当一个 ...

  5. UESTC 887 方伯伯的儿童节 --树形DP

    定义: 1.dp[u][1]表示u这个点设立糖果发放点且u这棵子树满足条件时的最少糖果点数 2.dp[u][0]表示u这个点不设立发放点且u这棵子树满足条件时的最少糖果点数 设v1,v2……vn为u的 ...

  6. CLOSE_WAIT?项目上线之际遇到这样的烦心事

    项目内测中,马上就要发布了,如今内测,所以很忙,今天运维那发来一堆状态,忘记截图了,简单来讲就是HTTP发送请求的时候有连接等待关闭,导致CLOSE_WAIT这个状态一直累加,没有释放,这样长时间下去 ...

  7. 关于JAVA应用中文字体显示小方框的问题解决

    最近碰到linux下jboss应用中中文字体显示为小方框: “在JRE 5以上的java环境中,java会自动加载$JAVA_HOME/jre/lib/fonts目录下的字体.链接或复制宋体或微软雅黑 ...

  8. java 16 -4 LinkedList的特有功能

    了解 LinkedList的特有功能: A:添加功能 public void addFirst(Object e) public void addLast(Object e) B:获取功能 publi ...

  9. ABP入门系列(6)——展现层实现增删改查

    这一章节将通过完善Controller.View.ViewModel,来实现展现层的增删改查.最终实现效果如下图: 一.定义Controller ABP对ASP.NET MVC Controllers ...

  10. vs2012无法启动已配置的开发Web服务器

    ] 有些教程说要开,我就没懂了