前言 前段时间为了查找泛型资料我翻译了OReilly 出版的《C# Cookbook》这本书的几个关于泛型的章节其中 反转Sorted List里的内容(见 )这一节中有一个接近行代码的例子当时看到这个例子吓了一跳这是一个足以让人头晕眼花的数字粗略看了一下感觉代码质量非常高非常值得我们去学习于是决定写一系列文章分析它象搭积木一样逐步把这个ReversibleSortedList构建完成 在读这一篇文章之前您需要明白一件事如果只在一个项目里用到这个类有必要花费行代码去构建它吗?我个人的观点是没有必要FCL(Framework Class Library)中有很多现成的东西拿过来用就行了那还有什么理由去研究它呢?我提供以下几点做为参考 l 想通过阅读高质量的代码来提高自己 l 对FCL如此着迷想通过它迈出第一步 l 您希望自己的代码有机会给其他程序员使用换句话说您面向的是程序员您是一个组件编写者从某一方面说您越麻烦就意味着您的用户越方便 呵呵不那么多疲话了开始工作 雏形 你想构建一个集合类用于存储数据它里面的值是成对出现的每一对值都包含键和值两个部分键和值里存放的数据类型是不确定的最好什么类型放到里面都适用想起了什么?就是它!泛型!真是太伟大了! 接下来要考虑的问题是采用什么样的方式来存储这些值你觉得自己的数据结构学得还比较好决定要控制一切在所有集合类型中数组的速度是最快的而且它使用方便并且是类型安全的唯一的缺点就是容量固定好!不管那么多了用的就是它先把代码写出来再说 public class ReversibleSortedList { private TKey[] keys; //键数组 private TValue[] values; //值数组 } 总算迈出了第一步确定了大的方向但是数组是容量固定的如何能让它的容量可以随着元素的增长而自动增长呢?即然要控制容量那就要有一个容量属性用于读取和设置容量先从读取开始容量值就是数组keys或values的长度好继续添加代码 public class ReversibleSortedList { private TKey[] keys; //键数组 private TValue[] values; //值数组 public int Capacity //容量属性 { get { return thiskeysLength; } } } 现在问题来了当ReversibleSortedList被实例化后直接读取Capacity属性将会调用keysLength属性来返回但此时keys并没有被初始化肯定不能访问其Length属性可不可以在声明的同时把它初始化为元素个数为的数组呢? private TKey[] keys = new TKey[]; //键数组 这样做是没有什么问题但它刚声明就成为了垃圾什么都放不了总让人感觉不舒服那可不可以让数组初始化为一个固定容量呢? private TKey[] keys = new TKey[]; //键数组 但你是一个完美主义者不希望这样就使用了个位置的空间你更希望在添加元素时才会有空间的拓展可不可以声明两个静态的初始长度为的数组做为其初始状态呢?这样不管类有多少个实例进行初始化时使用的都是它们这样即避免了空间的浪费也不再需要多次初始化长度数组 private static TKey[] emptyKeys; //用于键数组的初始化 private static TValue[] emptyValues; //用于值数组的初始化 可以在静态构造器(又称类型构造器)里把它们初始化为长度为的数组并在无参实例构造器中把这两个初始值赋给keys和values数组 为了测试自己的想法需要添加Main()方法进行测试下列代码可以直接拷贝并运行如果不知道如何运行请参考 ReversibleSortedList 版本对ReversibleSortedList类的容量进行初始化 using System; using SystemCollections; using SystemCollectionsGeneric; public class ReversibleSortedList { #region 成员变量 private TKey[] keys; //键数组 private TValue[] values; //值数组 private static TKey[] emptyKeys; //用于键数组的初始化 private static TValue[] emptyValues; //用于值数组的初始化 #endregion #region 构造方法 //类型构造器 static ReversibleSortedList() { ReversibleSortedListemptyKeys = new TKey[]; ReversibleSortedListemptyValues = new TValue[]; } public ReversibleSortedList() { thiskeys = ReversibleSortedListemptyKeys; thisvalues = ReversibleSortedListemptyValues; } #endregion #region 公有属性 public int Capacity //容量属性 { get { return thiskeysLength; } } #endregion } public class Test { static void Main() { ReversibleSortedList rs=new ReversibleSortedList(); ConsoleWriteLine(rsCapacity); } } 运行结果 |