C#学习之泛型功能与限制
在泛型类的描述中还会有时需要很多限制,例如对待一个泛型类型,在类中定义一个变量需要初始化时,不能确定是用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#学习之泛型功能与限制相关推荐
- 《Java 核心技术卷1 第10版》学习笔记 ------ 泛型【基础】
泛型从Java SE 5.0 中开始出现,是 Java 程序设计语言从 1.0 版本发布以来,变化最大的部分. 使用泛型机制编写的程序代码要比那些杂乱地使用 Object 变量,然后再进行强制类型转换 ...
- 发那科pmc编程手册_如何学习FANUC PMC功能指令
在之前的学习课程中我们学习了FANUC内置编程器以及LADDER III软件的操作,知道如何根据报警信息查找报警位置等相关的小技巧,但是呢,对于FANUC PMC的学习还有一部分是对程序的理解.这样才 ...
- 深圳大数据学习:泛型 --【千锋】
深圳大数据学习:泛型 --[千锋] 带有一个或多个类型参数的类是泛型的. 泛型类的定义: //带有类型参数A的类定义 class Stack[A] { private var elements: Li ...
- python青年大学习一键提醒功能(团支书、辅导员必备)(一)
青年大学习一键提醒功能,以我自己的学校为例子. 原因: 上学期做了班级团支书,发现每周都要提醒班上同学做青年大学习,有些同学总是会忘记. 为了让同学们能及时学习新思想,争做新青年!!! 然后就想做一个 ...
- 三星推出增加了深度学习和图像处理功能的Exynos 7应用处理器
文章来源:ATYUN AI平台 三星新推出的中端移动应用处理器Exynos 7 9610具有深度学习和更快的图像处理能力,并将于2018年下半年推出. 三星电子(Samsung Electronics ...
- 树莓派学习笔记——GPIO功能学习
0.前言 树莓派现在越来越火,网上树莓派的资料也越来越多.树莓派源自英国,国外嵌入式开源领域具有良好的分享精神,树莓派各种集成库也层出不穷,下面推荐几个. [ python GPIO ] [开发语言] ...
- ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof
一:如何去学习?都去学习什么? 1:学习优秀项目的设计思想,多问几个为什么,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中 2:学习优秀项目的代码风格,代码的封装设计 ...
- Scala 语言学习之泛型(7)
==> 泛型类 ---> T 可以代表任意类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Person[T]{ private ...
- Java学习之——泛型
1.概要 generics enable types (classes and interfaces) to be parameters when defining classes, interfac ...
- ios12怎么滑屏解锁_对比苹果iOS12和安卓9.0,相互学习了哪些功能
上周,安卓最新版安卓9.0已经推送了正式版本,而iOS12也已经发布了Beta7,无限接近于正式版.如无意外,在九月份,无论是安卓还是iOS,都会完成今年的系统例行换代. 而出乎人们意料但又在情理之中 ...
最新文章
- 对于webservice响应,text / xml与application / xml之间有什么区别
- Py之xlwt:python库之xlwt的简介、安装、使用方法之详细攻略
- elementui可编辑单元格_ElementUI 表格可编辑单元格
- 使用函数输出水仙花数
- 四川专利代理机构列表
- linux启动http服务
- 反编译object文件c语言,能不能通过反编译程序看.sys文件的源代码!
- 国内首个SENT 信号解析软件 适配NXP KMA321, melexis MLX90372等SENT信号输出芯片 完美替代PicoScope 解析SENT
- 主机前面板耳机插孔无声音解决
- 产品经理日常工作之流程图
- 微信小程序前端【订阅消息】遇到的问题及总结
- WPS中用mathtype插入公式的方法
- 使用JavaScript生成二维码和识别二维码
- Bootstrap系列之表单(Forms)
- Java8 - 使用 Comparator.comparing 进行排序
- TNF拮抗剂的结构、功能与结核感染_Wallis2008
- 计算机蓝屏安全模式都启动不了,stop:0x00000074蓝屏无法进入安全模式无法开机 解决办法...
- Orthogonal Convolutional Neural Networks
- 2021年小组年会总结
- java手机怎样越狱_ipad怎么自己越狱 两种方法介绍【图文】
热门文章
- ** 安装好的Apache服务器不能在本地计算机启动
- vue更新路由router-view复用组件内容不刷新
- 获取笔记本序列号(SN码)命令
- C++17 Any类
- MySQL VARCHAR的说明信息
- httpclient java多线程_Apache HttpClient4.5多个HTTP请求使用多线程执行
- hadoop 权限错误 Permission denied: user=root, access=WRITE, inode=“/“:hdfs:super
- python策略模式包含角色_Python 之策略模式
- 大数据学情分析_大数据时代|如何轻松做好学情分析
- 事务对性能影响_mysql之事务