在泛型类的描述中还会有时需要很多限制,例如对待一个泛型类型,在类中定义一个变量需要初始化时,不能确定是用Null还是0.

因为不能够确定它是值类型还是引用类型,这时可以用到default语句(下面有介绍)。

下面的是一个文档管理器的详细代码和必要详细的解释。

  1 //定义一个具有内容和标题属性的接口
  2
  3 namespace Function
  4 {
  5     public interface IDocument
  6     {
  7         string Content { set; get; }
  8         string Title { set; get; }
  9     }
 10 }
 11 //下面是文档类型的具体描述,它继承了上面的接口
 12 namespace Function
 13 {
 14     public class Document:IDocument
 15     {
 16         public Document()
 17         {
 18
 19         }
 20         public Document(string title,string content)
 21         {
 22             this.Title = title;
 23             this.Content = content;
 24         }
 25         public string Title
 26         {
 27             get;
 28             set;
 29         }
 30         public string Content
 31         {
 32             get;
 33             set;
 34         }
 35     }
 36 }
 37
 38 //下面是文档管理器类的具体描述
 39 namespace Function
 40 {
 41     //下面类中的where 子句的作用是要求
 42     //本泛型类的T的具体类型必须是继承IDcoument接口的。
 43     //如果T类型不是继承IDcoument接口,那么就不能应用到本泛型类
 44     //这里的DocumentManager<T>可以实现任何继承了接口IDcoument的类型
 45     //where子句还有很多其他的意义,可以看最后的图片介绍
 46     public class DocumentManager<T> where T : IDocument
 47     {
 48         private readonly Queue<T>documentQueue=new Queue<T>();
 49         public void AddDocument(T doc)
 50         {
 51             //Lock语句的通俗点的意思是当有一个函数在调用本模块时,其他的函数就不能再次调用
 52             //等到这里执行完毕后再被其他的使用
 53            lock(this)
 54             {
 55                 documentQueue.Enqueue(doc);
 56             }
 57         }
 58         public bool IsDocumentAvailable()
 59         {
 60             return (documentQueue.Count > 0);
 61         }
 62         public T GetDocument()
 63         {
 64             T doc = default(T);//定义doc变量,并赋予初值
 65             //但是因为此处的T类型并不明确是引用类型还是值类型,
 66             //赋初值时就不能明确赋予Null还是0
 67             //default(T)可以根据类型自动赋值
 68             lock(this)
 69             {
 70                 doc = documentQueue.Dequeue();
 71             }
 72             return doc;
 73         }
 74         public void DisplayAllDocuments()
 75         {
 76             foreach(T doc in documentQueue)
 77             {
 78                 Console.WriteLine(doc.Title);
 79             }
 80         }
 81
 82     }
 83 }
 84 //下面是主函数
 85 using System;
 86 using System.Collections.Generic;
 87 using System.Linq;
 88 using System.Text;
 89 using System.Threading.Tasks;
 90
 91 namespace Function
 92 {
 93     class Program
 94     {
 95         static void Main(string[] args)
 96         {
 97 //实例化文档管理器类,并且赋值,然后取出其中的值
 98             var dm = new DocumentManager<Document>();
 99             dm.AddDocument(new Document("name1","content1"));
100             dm.AddDocument(new Document("name2", "content2"));
101             dm.AddDocument(new Document("name3", "content3"));
102             dm.DisplayAllDocuments();
103             while(dm.IsDocumentAvailable())
104             {
105                 Document doc = null;
106                 doc = dm.GetDocument();
107                 Console.WriteLine(doc.Content+" "+doc.Title);
108             }
109             Console.ReadKey();
110             return;
111         }
112
113     }
114 }

下面是where子句的详细介绍,也可以参看http://msdn.microsoft.com/zh-cn/library/bb384067.aspx。有详细而专业的介绍。

约束语句 说明
where T:struct 对于结构的约束,类型T必须是值类型
where T:class 类约束指定类型T必须是引用类型
where T:IFoo 指定类型T必须实现接口IFoo
where T:Foo 指定类型T必须实现基类Foo
where T:new() 这是一个构造函数的约束,指定类型T必须有一个默认的构造函数
where T1:T2 这个约束也可以指定,类型T1派生自泛型类型T2,该约束也称裸类型约束

where 子句只能为默认构造函数定义构造函数约束,不能为其他构造函数定义构造函数约束。

使用泛型类还可以合并多个约束。例如where T:IFoo,new().其意义就是说T必须继承实现IFoo接口也要有默认构造函数

在where语句中只能定义基类,接口和默认构造函数

转载于:https://www.cnblogs.com/sytu/p/3984314.html

C#学习之泛型功能与限制相关推荐

  1. 《Java 核心技术卷1 第10版》学习笔记 ------ 泛型【基础】

    泛型从Java SE 5.0 中开始出现,是 Java 程序设计语言从 1.0 版本发布以来,变化最大的部分. 使用泛型机制编写的程序代码要比那些杂乱地使用 Object 变量,然后再进行强制类型转换 ...

  2. 发那科pmc编程手册_如何学习FANUC PMC功能指令

    在之前的学习课程中我们学习了FANUC内置编程器以及LADDER III软件的操作,知道如何根据报警信息查找报警位置等相关的小技巧,但是呢,对于FANUC PMC的学习还有一部分是对程序的理解.这样才 ...

  3. 深圳大数据学习:泛型 --【千锋】

    深圳大数据学习:泛型 --[千锋] 带有一个或多个类型参数的类是泛型的. 泛型类的定义: //带有类型参数A的类定义 class Stack[A] { private var elements: Li ...

  4. python青年大学习一键提醒功能(团支书、辅导员必备)(一)

    青年大学习一键提醒功能,以我自己的学校为例子. 原因: 上学期做了班级团支书,发现每周都要提醒班上同学做青年大学习,有些同学总是会忘记. 为了让同学们能及时学习新思想,争做新青年!!! 然后就想做一个 ...

  5. 三星推出增加了深度学习和图像处理功能的Exynos 7应用处理器

    文章来源:ATYUN AI平台 三星新推出的中端移动应用处理器Exynos 7 9610具有深度学习和更快的图像处理能力,并将于2018年下半年推出. 三星电子(Samsung Electronics ...

  6. 树莓派学习笔记——GPIO功能学习

    0.前言 树莓派现在越来越火,网上树莓派的资料也越来越多.树莓派源自英国,国外嵌入式开源领域具有良好的分享精神,树莓派各种集成库也层出不穷,下面推荐几个. [ python GPIO ] [开发语言] ...

  7. ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof

    一:如何去学习?都去学习什么? 1:学习优秀项目的设计思想,多问几个为什么,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中 2:学习优秀项目的代码风格,代码的封装设计 ...

  8. Scala 语言学习之泛型(7)

    ==> 泛型类         ---> T 可以代表任意类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Person[T]{   private ...

  9. Java学习之——泛型

    1.概要 generics enable types (classes and interfaces) to be parameters when defining classes, interfac ...

  10. ios12怎么滑屏解锁_对比苹果iOS12和安卓9.0,相互学习了哪些功能

    上周,安卓最新版安卓9.0已经推送了正式版本,而iOS12也已经发布了Beta7,无限接近于正式版.如无意外,在九月份,无论是安卓还是iOS,都会完成今年的系统例行换代. 而出乎人们意料但又在情理之中 ...

最新文章

  1. 对于webservice响应,text / xml与application / xml之间有什么区别
  2. Py之xlwt:python库之xlwt的简介、安装、使用方法之详细攻略
  3. elementui可编辑单元格_ElementUI 表格可编辑单元格
  4. 使用函数输出水仙花数
  5. 四川专利代理机构列表
  6. linux启动http服务
  7. 反编译object文件c语言,能不能通过反编译程序看.sys文件的源代码!
  8. 国内首个SENT 信号解析软件 适配NXP KMA321, melexis MLX90372等SENT信号输出芯片 完美替代PicoScope 解析SENT
  9. 主机前面板耳机插孔无声音解决
  10. 产品经理日常工作之流程图
  11. 微信小程序前端【订阅消息】遇到的问题及总结
  12. WPS中用mathtype插入公式的方法
  13. 使用JavaScript生成二维码和识别二维码
  14. Bootstrap系列之表单(Forms)
  15. Java8 - 使用 Comparator.comparing 进行排序
  16. TNF拮抗剂的结构、功能与结核感染_Wallis2008
  17. 计算机蓝屏安全模式都启动不了,stop:0x00000074蓝屏无法进入安全模式无法开机 解决办法...
  18. Orthogonal Convolutional Neural Networks
  19. 2021年小组年会总结
  20. java手机怎样越狱_ipad怎么自己越狱 两种方法介绍【图文】

热门文章

  1. ** 安装好的Apache服务器不能在本地计算机启动
  2. vue更新路由router-view复用组件内容不刷新
  3. 获取笔记本序列号(SN码)命令
  4. C++17 Any类
  5. MySQL VARCHAR的说明信息
  6. httpclient java多线程_Apache HttpClient4.5多个HTTP请求使用多线程执行
  7. hadoop 权限错误 Permission denied: user=root, access=WRITE, inode=“/“:hdfs:super
  8. python策略模式包含角色_Python 之策略模式
  9. 大数据学情分析_大数据时代|如何轻松做好学情分析
  10. 事务对性能影响_mysql之事务