正在阅读:C# 最强大的功能--泛型简介C# 最强大的功能--泛型简介

2005-06-23 10:16 出处: 作者:Juval Lowy 责任编辑:moningfeng

一般集合

System.Collections 中的数据结构全部都是基于 Object 的,因而继承了本文开头描述的两个问题,即性能较差和缺少类型安全。.NET 2.0 在 System.Collections.Generic 命名空间中引入了一组一般集合。例如,有一般的 Stack 类和一般的 Queue 类。Dictionary 数据结构等效于非一般的 HashTable,并且还有一个有点像 SortedList 的 SortedDictionary 类。类 List 类似于非一般的 ArrayList。表 1 将 System.Collections.Generic 的主要类型映射到 System.Collections 中的那些主要类型。

表 1. 将 System.Collections.Generic 映射到 System.Collections
System.Collections.GenericSystem.Collections

Comparer

Comparer

Dictionary

HashTable

LinkedList

-

List

ArrayList

Queue

Queue

SortedDictionary

SortedList

Stack

Stack

ICollection

ICollection

IComparable

System.IComparable

IDictionary

IDictionary

IEnumerable

IEnumerable

IEnumerator

IEnumerator

IList

IList



System.Collections.Generic 中的所有一般集合还实现了一般的 IEnumerable 接口,该接口的定义如下所示:

public interface IEnumerable
{
IEnumerator GetEnumerator();
}
public interface IEnumerator : IDisposable
{
T Current{get;}
bool MoveNext();
}




简单说来,IEnumerable 提供了对 IEnumerator 迭代器接口的访问,该接口用于对集合进行抽象迭代。所有集合都在嵌套结构上实现了 IEnumerable,其中,一般类型参数 T 是集合存储的类型。

特别有趣的是,词典集合定义它们的迭代器的方式。词典实际上是两个类型(而非一个类型)的一般参数(键和值)集合。System.Collection.Generic 提供了一个名为 KeyValuePair 的一般结构,其定义如下所示:

struct KeyValuePair
{
public KeyValuePair(K key,V value);
public K Key(get;set;)
public V Value(get;set;)
}



KeyValuePair 简单地存储一般键和一般值组成的对。该结构就是词典作为集合进行管理的类型,并且是它用于实现它的 IEnumerable 的类型。Dictionary 类将一般 KeyValuePair 结构指定为 IEnumerable 和 ICollection 的项参数:

public class Dictionary : IEnumerable,
ICollection,
//More interfaces
{...}



KeyValuePair 中使用的键和值类型参数当然是词典自己的一般键和值类型参数。您无疑可以在您自己的使用键和值对的一般数据结构中完成同样的工作。例如:

public class LinkedList : IEnumerable where K : IComparable
{...}



序列化和泛型

.NET 允许您具有可序列化的一般类型:

[Serializable]
public class MyClass
{...}



在序列化类型时,除了持久保持对象成员的状态以外,.NET 还持久保持有关该对象及其类型的元数据。如果可序列化的类型是一般类型并且它包含绑定类型,则有关该一般类型的元数据还包含有关该绑定类型的类型信息。因此,一般类型的每个带有特定参数类型的变形都被视为唯一的类型。例如,您不能将对象类型 MyClass 序列化(而只能将其反蛄谢┪?MyClass 类型的对象。序列化一般类型的实例与序列化非一般类型没有什么不同。但是,在反序列化该类型时,您需要通过匹配的特定类型声明变量,并且在向下强制转换从 Deserialize 返回的 Object 时再次指定这些类型。代码块 13 显示了一般类型的序列化和反序列化。
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品