C# in Depth Third Edition 学习笔记-- C#2.0: 解决C#1.0的问题 1 泛型

用泛型实现参数化类型

1. 泛型更好滴编译时检查,能消除很多装箱和拆箱

2. 泛型字典 Dictionary<TKey, TValue>

 1 static Dictionary<string,int> CountWords(string text)
 2 {
 3     Dictionary<string,int> frequencies;
 4     frequencies = new Dictionary<string,int>();
 5
 6     string[] words = Regex.Split(text, @"\W+");
 7
 8     foreach (string word in words)
 9     {
10         if (frequencies.ContainsKey(word))
11         {
12             frequencies[word]++;
13         }
14         else
15         {
16             frequencies[word] = 1;
17         }
18     }
19     return frequencies;
20 }
21
22 ...
23 string text = @"Do you like green eggs and ham?
24                 I do not like them, Sam-I-am.
25                 I do not like green eggs and ham.";
26
27 Dictionary<string, int> frequencies = CountWords(text);
28 foreach (KeyValuePair<string, int> entry in frequencies)
29 {
30     string word = entry.Key;
31     int frequency = entry.Value;
32     Console.WriteLine("{0}: {1}", word, frequency);
33 }

3. 泛型有两种:泛型类型(类、接口、委托和结构,但没有泛型枚举)和泛型方法。

类型参数是真实类型的占位符,这些真实的类型称为类型实参(type argument)。使用泛型类型或方法时,要是有真实的类型代替。上面的泛型字典在使用时,类型实参string代替TKey,int代替TValue。

4. 类型约束

引用类型约束:struct RefSample<T> where T : Class 约束T的类型为引用类型,当然T 也可以约束为接口,数组,委托或者其他的已知的引用类型

有效的约束:RefSample<IDisposable>   RefSample<string> RefSample<int[]>

无效的约束:RefSample<Guid> RefSample<int>

被约束的类型与类型本身有差别的,这里的类型本身是个值类型。

值类型约束:class ValSample<T> where T :struct 约束T为值类型,包括枚举,但排除可空类型。

有效的约束:ValSample<int>   ValSample<FileMode>

无效的约束:ValSample<object> ValSample<StringBuilder>

构造函数约束:T : new(), 必须是所有参数约束的最后一个约束。它将检查类型的实参是否有用于创建类型实例的无参构造函数。

适用于:所有值类型;所有没有显式声明构造函数的非静态、非抽象类;所有显式声明了一个公共无参构造函数的非抽象类。

转换类型约束:

组合约束案例:

5. 高级泛型

静态字段:若在SomeClass中声明了静态字段X,不管SomeClass创建多少个实例, 也不管从SomeClass派生多少个类型,都只有一个SomeClass.X字段。

JIT如何处理泛型?

泛型迭代:在C#2 中遍历由值类型元素构成的泛型集合(List<int>)根本就不会装箱。

反射和泛型:typeof、System.Type

C# in Depth Third Edition 学习笔记-- C#2.0: 解决C#1.0的问题 1 泛型

时间: 2024-10-11 14:03:39

C# in Depth Third Edition 学习笔记-- C#2.0: 解决C#1.0的问题 1 泛型的相关文章

C# in Depth Third Edition 学习笔记-- 值类型和引用

I. C#中值类型和引用类型 1. 类class 引用类型,结构struct值类型 2. 数组是引用类型,即使元素是值类型,int[]是引用类型 3. 枚举是值类型enum 4. 委托类型delegate是引用类型 5. 接口类型interface是引用类型,但可以由值类型实现. II. 值的表达式:表达式“2+3”的值就是5:而对于引用类型的表达式,它的值是一个引用,而不是该引用所指代的对象,如String.Empty的值不是一个空字符串,而是对空字符串的一个引用. III. 变量的值在它声明

C# in Depth Third Edition 学习笔记-- 可空类型

1. 没有值怎么办? 客户下了一份订单,有订货日期,但尚未发货,但没有发货日期,怎么表述发货日期? C#2以后使用可空类型. 2. 为什么值类型的变量不能是null? 引用类型变量,其值是一个引用,即一个非空引用值提供了访问一个对象 的途径,对于null来说,作为一个特殊值,意味着不引用任何对象.所有引用的默认值都为null,内存中表示全零. 值类型变量,其值是它本身的真实数据.null不是有效的值类型的值. 3. C#1 解决不存在可空值类型 魔值:DateTime,牺牲公元元年中的某个值Da

C# in Depth Third Edition 学习笔记-- C#2的一些特性

1. Partial class: 可以在多个源文件中写一个类.特别适合部分代码自动生成,部分代码手动添加的特性. 编译器在编译前会把所有的源文件合并到意洽.但是一个方法不能在一个文件中开始,在另一个文件中结束. C#3中独有的pratial 方法: // Generated.cs using System; partial class PartialMethodDemo { public PartialMethodDemo() { OnConstructorStart(); Console.W

Berkely DB Java Edition学习笔记

Berkely DB对于高并发.要求速度快的应用来说是个不错的选择,mysql就是用BDB实现的(mysql的后台) ,mysql快,BDB比mysql还要快N倍.BDB是一种嵌入式的.非关系数据库,它与其他的关系数据库RMDBS不同,它没有提供SQL,而是提供 了自己的访问接口.作为一种嵌入式的数据库,它是进程内模式的,也就是说它和应用程序在同一内存空间运行,所以速度要高很多,与嵌入式的数据库如 Derby.HSQLDB(都是RMDBS的)相比,它效率更高,使用方法也有很大的不同.现在BDB以

Swift 2.0学习笔记(Day 3)——Swift 2.0之后增加的关键字

Swift 2.0学习笔记(Day 3)——Swift 2.0之后增加的关键字 看了之前的学习笔记知道了什么是关键字,现在提示各位在Swift 2.0之后增加defer.guard.repeat.catch.rethrows.throw.throws和try关键字,其中repeat关键字替代do - while循环中的do,即中repeat - while循环.而do关键字用于错误处理.catch.rethrows.throw.throws和try是错误处理关键字. 错误处理是Swift 2.0

cocos2d-x学习笔记(三)解决cocos2d::Director没有成员getTouchDispatcher问题

初学者在学习代码阶段偶尔会把项目代码拿过来编译,然后看下运行结果再研究代码.如果别人的项目代码是用cocos2d-x 3.0之前的版本编写的,而自己用的cocos2d-x是3.0以后的,编译的时候经常会碰到如下问题: Error:class "cocos2d::Director"没有成员"getTouchDispatcher" 在3.0版本以前,之前所用的 CCTouchBegan.CCTouchMoved.CCTouchEnd这些都已经不能再用了,现在是让监听器自

OpenCV学习笔记(八)—— OpenCV 3.1.0 + opencv_contrib编译(Windows)

由于在学习图像识别中的特征点检测中,需要用到Surf和Sift算法,但是这两个算法在OpenCV 3.1.0的Release版本中并不存在,因为他们是存放在opencv_contrib目录下面的未稳定功能模块,所以如果我们想要使用这个目录的功能,就需要自己重新进行OpenCV的编译. 一.准备工作: 1.下载OpenCV安装包:https://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.0.0/ 安装过程实际上就是解压过程,

Kinect学习笔记之二Kinect for Windows 2.0新特性

这是本博客的第一篇翻译文档,笔者已经苦逼的竭尽全力的在翻译了,但无奈英语水平也是很有限,有不对或者不妥当不准确的地方必然会有,还恳请大家留言或者邮件我以批评指正,我会虚心接受.谢谢大家. 原文网址:https://msdn.microsoft.com/en-us/library/dn782041.aspx 2014年10月由微软发布的Kinect for Windows 2.0 SDK中包含如下文所述的新特性.新工具以及新文档. 本次发布的改进: 1.Windows应用商店的支持 通过此版本的K

Qt学习笔记-Qtcreator的webkit和qt4.7.0的版本有关

之前下载了一个最新的是qtcreator,是通过ubuntu的是apt-get下载的.可是里面没有webkit控件.网上的网友说是最新的没有了.要用老版的,于是下载了一个2.5.2的就正常了. 用老版本的qtcreator无法正常显示网页在webkit. 后来发现是qt版本的问题. 我之前用的qt4.7.0是无法显示的.  改成4.8.6就正常了.