其他范型类
.NET 2.0 基础类库对范型的应用当然并不仅限于范型集合和 Functional Programming。下面所列的范型类也都有其明确的设计目的和用途。
Array
在.NET 2.0中,Array 类扩充了对范型编程的支持。当然,Array类本身并不是范型类(出于兼容的考虑),而是提供了一系列支持范型的方法。除了前面提到的 Functional Programming 的支持外,Array 类还对以前很多基于 object 的方法提供了对应的范型版本,这样对值类型可以提高查找和排序时的性能。例如:
static int IndexOf
static void Sort
另外,还添加了一些新的范型方法,例如:
static IList
static void Resize
还有一个好消息是,在 .NET 2.0 中,数组将支持范型集合接口。我们知道,在 .NET 2.0 以前,Array 抽象类实现了 IList,ICollection 和 IEnumerable 集合接口,这样我们可以在需要传入这些接口的地方传入数组。在 .NET 2.0 中,范型集合需要使用如 IEnumerable<T>
class int[] : Array, List<int>
ArraySegment<T>
ArraySegment<T>
class Encoding {
public virtual byte[] GetBytes(char[] chars);
public virtual byte[] GetBytes(char[] chars, int index, int count);
...
}
对类的设计者来说,提供如此多的重载显得麻烦和笨拙,而且这些重载方法实际上都对应同一个实现。另外,设计如此多的虚函数也给子类的实现者带来了不少麻烦,尤其是当这些函数是 abstract 时。
在 .NET 2.0 中,微软试图通过提供 ArraySegment<T>
class Encoding {
public virtual byte[] GetBytes(ArraySegment<char>
...
}
而由调用者来决定如何传入数组参数,例如:
char[] chars = ...;
byte[] bytes = enc.GetBytes(new ArraySegment<char>
或
byte[] bytes = enc.GetBytes(new ArraySegment<char>
可以看到,使用 ArraySegment<char>
Nullable<T>
Nullable<T>
Nullable<T>
值得一提的是,C# 2.0 为 Nullable<T>
int? a = null; // a为空(即HasValue属性为false)
int? b = 10; // b为10
以后,在设计可能返回无效值的 API 时,除了以前使用的抛出异常的方法外,我们也可以使用 Nullable<T>
int ParseNumber(string s); // 使用异常
int? TryParseNumber(string s); // 不使用异常,而使用Nullable<T>
EventHandler<T>
事件的定义和使用遍及 .NET Framework 的各个角落。在没有范型的情况下,每个事件委托都要单独定义,例如:
delegate void EventHandler(object sender, EventArgs e);
delegate void KeyEventHandler(object sender, KeyEventArgs e);
这样的缺点是对事件定义者来说每次都要定义新的事件委托,而对使用者来说又要多学习和记忆新的事件委托。在 .NET 2.0 中,引入了 EventHandler
delegate void EventHandler
使用 EventHandler
class MyEventArgs : EventArgs {
...
}
class Foo {
public event EventHandler<MyEventArgs>
...
}
Foo foo = new Foo();
foo.MyEvent += new EventHandler<MyEventArgs>
...