泛型
泛型不仅限于类,还可以被用于委托、接口和方法。
泛型的优点:
1. 性能:对于值类型使用非泛型集合类,在把值类型转换为引用类型,和把引用类型转化为值类型时需要进行装箱和拆箱操作。装箱和拆箱操作很容易使用,但性能损失比较大,迭代许多项时尤其如此。
2. 类型安全:
List<int> list = new List<int>();
list.Add(40);
list.Add("a"); //编译时报错
3. 二进制代码的重用
4. 代码的扩展
命名约定:
1. 泛型类型的名称用字母T做前缀
2. 如果没有特殊的要求,泛型类型允许用任意类代替,且只使用了一个泛型类型。
3. 如果一个泛型类型有特定的要求(例如必须实现一个借口或者派生于基类),或者使用了两个或多个泛型类型,就应该泛型类型描述性的名称。
public delegate void EventHanlder
(Object sender,IEventArgs e);
public
class SortedList
{}
泛型类:
using System.Collections.Generic;
public class LinkedListNode
{
private T
value;
public T Value
{
get {
return
value; }
}
public LinkedListNode(T
value)
{
this.
value =
value; }
private LinkedListNode
next;
public LinkedListNode
Next
{
get {
return next; }
internal set {next=
value;}
}
private LinkedListNode
prev;
public LinkedListNode
Prev { get {
return prev; }
internal set { prev =
value; } } }
泛型类的特性:
1. 默认值:
不能把null赋予泛型类型。此时可以使用default关键字。原因是泛型类型可以实例化为值类型,而null只可以用于引用类型。通过default关键字,将null 值赋予引用类型,将0赋予值类型。
T doc = default(T);
2. 约束:
如果泛型类需要调用泛型类型上的方法,就必须添加约束。
public class DocumentManager
where TDocument:IDocument
3. 继承
泛型类可以执行泛型接口,也可以派生于一个类。泛型类可以派生于泛型基类:
其要求是必须重复接口泛型类型,或者必须制定基类的类型。
4. 静态成员
泛型类的静态成员需要特别关注。泛型类的静态成员只能在一个类的实例中共享。
public class StaticDemo
{
public
static
int x;
}
public
class StaticTest
{
public StaticTest()
{
StaticDemo
.x = 4;
StaticDemo<
int>.x = 5;
Console.WriteLine(StaticDemo
.x);
//4
}
}
泛型接口
使用泛型可以定义接口,接口中的方法可以带泛型参数。
public interface IComparable
{
int CompareTo(T other);
}
泛型方法:
除了定义泛型类外,还可以定义泛型方法,在泛型方法中,泛型类型用方法声明来定义
public void Swap
(
ref T x,
ref T y)
{
T temp;
temp = x;
x = y;
y = temp;
}
泛型委托:
public delegate TSummary Action
(TInput t, TSummary u);
public
static TSummary Accumulate
(IEnumerable
col, Action
action)
{
TSummary sum =
default(TSummary);
foreach (TInput input
in col)
{
sum = action(input, sum);
}
}