CLR笔记:16.泛型

泛型:支持值类型和引用类型,不支持枚举。

没有泛型属性。

泛型的好处:

源代码保护。使用泛型算法不需要访问算法的源码——相对于C++模板

类型安全——相对于ArrayList

更加清晰的源码——不需要拆箱,显示转换

更佳的性能——不用装箱。测试:循环1000万次,泛型List<T>与ArrayList分别用时0.1s和 2s

16.1    FCL中的泛型

List<T> 取代ArrayList

Directory<TKey, TValue>取代HashTable

Stack<T>,Queue<T>分别取代Stack,Queue

IList,IDirectory,ICollection,IEnumerator,IEnumerable,IComparer,IComparable分别由相 应的泛型接口(加上<T>)

16.3    泛型基础结构

这一节的前言很有意思:如何在已有的CLR中添加泛型:

创建新的IL泛型指令

修改元数据格式,以支持泛型参数/类型/方法

修改各种语言C#/VB.NET

修改编译器csc,使之生成新的IL泛型指令/元数据

修改JITer,使之可以处理新的IL泛型指令

创建新的反射成员:泛型参数/类型/方法

修改调试器

修改vs2005智能感知

时间: 2024-09-21 18:45:47

CLR笔记:16.泛型的相关文章

CLR笔记系文章目录索引

CLR笔记:18.可空值类型 CLR笔记:17.自定义属性 CLR笔记:16.泛型 CLR笔记:15.委托 CLR笔记:14.接口 CLR笔记:13.数组 CLR笔记:12.枚举类型和位标志 CLR笔记:11.字符串 CLR笔记:10.事件 CLR笔记:9.Property CLR笔记:8.方法 CLR笔记:7.常量和字段 CLR笔记:6.类型和成员基础 CLR笔记:5.基元,引用和值类型 CLR笔记:4.类型基础 CLR笔记:3.共享程序集合强命名程序集 CLR笔记:2.生成,打包,部署,管理

操作系统概念学习笔记 16 内存管理(二) 段页

操作系统概念学习笔记 16 内存管理 (二) 分页(paging) 分页(paging)内存管理方案允许进程的物理地址空间可以使非连续的.分页避免了将不同大小的内存块匹配到交换空间上(前面叙述的内存管理方案都有这个问题,当位于内存中的代码和数据需要换出时,必须现在备份存储上找到空间,这是问题就产生了.备份存储也有前面所述的与内存相关的碎片问题,只不过访问更慢). 传统上,分页支持一直是由硬件来处理的.最近的设计是通过将硬件和操作系统相配合来实现分页. 基本方法 实现分页的基本方法设计将物理内存分

CLR笔记:7.常量和字段

1.常量 常量是永远不会改变的符号.它的值必须在编译时就确定.编译后,CLR将常量的值保存在Assembly的 元数据中,这意味着常量必须是基元类型. 常量是类型的一部分,总是被当成静态成员,但并不显示声明为static. public const Int32 MaxEntriesList = 100; 当代码引用常量时,CLR在元数据中查找该符号,将提取的常量值嵌入到IL中,所以常量没有地址以及 相应的分配内存,而且不能通过引用传递变量,也就是说,在导入一个外部的DLL时,就已经将其中的常 量

java基础学习笔记之泛型_java

泛型 将集合中的元素限定为一个特定的类型. 术语 ArrayList<E> -- 泛型类型 ArrayList -- 原始类型 E -- 类型参数 <> -- 读作"typeof" ArrayList<Integer> -- 参数化的类型 Integer -- 实际类型参数 几点注意: 参数化类型和原始类型相互兼容 ArrayList collection1 = new ArrayList<Integer>();//通过,无warning

CLR笔记:18.可空值类型

前言:System.Nullable<T>在FCL中的实现: System.Nullable<T> where T:struct,所以Nullable<T>是一个值类型 有两个只读属性HasValue和Value,以及GetValueOrDefault方法 18.1 C#语法:Int32? 等价于 Nullable<Int32>,于是可以有: Int32? a = 5; Int32? b = null; 允许类型转换:Int32 c = (Int32)a;

CLR笔记:14.接口

CLR以及所有托管语言都不支持多继承,通过接口模拟实现 14.1 类和接口的实现 接口定义:为一组方法签名指定一个名称的方式. 类实现接口,就一定要提供接口所有方法的实现. 即使抽象类,也要全部实现,但是,它可以把接口方法声明为abstract的,从而把这个接口方法留给 派生类去实现,如下: public interface ITest { void Test(); } public abstract class AbstractClass : ITest { public abstract v

CLR笔记:13.数组

CLR支持一维/多维/交错数组. 两种声明方式: Array a; a = new String[0, 1]; String[] s = new String[5]; 注意,声明不要给与数组长度,因为此时还不分配内存:new时要指定长度. 将数组声明为Array和像String[]这样带中括号的,效果是一样的,只是前者更灵活,当然类型不安全 ,可能会有运行期错误. 所有数组都隐式派生于System.Array,后者派生自System.Object,所以数组是引用类型. 值类型的数组,new时,会

CLR笔记:11.字符串

11.1 字符 Char,16位Unicode代码值 两个常量字段,Char.MinValue:定义为'\0':Char.MaxValue:定义为'\uffff': Char.GetUnicodeCategory()方法,返回字符类型(货币/标点/数学符号等等) Char与Int32的相互转型: 11.2 字符串 只能是String s = "Jax";,而不能使用new来建立字符串 以上语句,在IL中,并没有newobj,而是ldstr:因为字符串是一个常量,不可更改immutabl

CLR笔记:9.Property

属性分两种,无参属性,有参属性,后者又叫索引器(indexer)--VB.NET中相应为默认属性. 1.无参属性 CLR支持静态属性,实例属性,抽象属性,虚拟属性,但不能被重载. 属性在MSIL中生成以下内容: get_XX方法,当在属性中定义了get的时候--XX为属性名 set_XX方法,当在属性中定义了set的时候--XX为属性名 一个位于原数据中的属性定义. 属性不能作为out/ref传递给方法,字段则可以. 如果属性中执行语句过多,要花很多时间,这时候优先选用方法.例如线程同步和Rem