以下为看李建忠在MSDN上的WebCast而做的笔记
C#泛型及机制
泛型是通过参数化类型来实现在同一份代码上操作不同数据类型的编程 范式。
泛型示例:
class
Stack
<
T
>
{
private T[] store;
private int size;

Stack()
{
store = new T[10];
size = 0;
}

void Push(T t)
{
store[size++] = t;
}

public T Pop()
{
return store[--size];
}
}

Stack
<
string
>
st
=
new
Stack
<
string
>
();
st.Push(
"
first
"
);

Stack
<
int
>
nt
=
new
Stack
<
int
>
();
nt.Push(
15
);
泛型在编译为IL代码和元数据时,采用特殊的占位符来表示泛型类型 ,并使用专有的IL指令支持泛型操作。而真正的泛型实例化发生在J
IT编译期间。如上例中,第一次编译时只为Stack<T
>生成泛型版的IL代码和元数据,其中T充当占位符
。到了JIT编译阶段,当JIT编译器第一次碰到Stack
<string>时,将用string替换IL代码和元数据中的T
,进行泛型类型实例化。
CLR为所有类型参数为引用类型的泛型类型产生同一份IL代码 ;而对于值类型,则是一种值类型,生成一份IL代码。
泛型方法
泛型机制只支持泛型方法,不支持在除方法外的其它成员(如属性 、事件、索引器等等)的声明上包含类型参数。
public
class
Finder
{
public static int Find<T>(T[] items, T item)
{
for(int i = 0; i < items.Length; i++)
{
if (items[i].Equals(item)) return i;
}

return -1;
}
}

int
result
=
Finder.Find(
new
string
[]
{"a", "b", "c", ..."z"}
,
"
x
"
);
泛型约束
C#泛型要求对"所有泛型类型或泛型方法的类型参数"的任何假定 ,都要基于显式的约束,以维护C#所要求的类型安全。
显式约束由Where子句表达,可以制定基类约束,接口约束 ,构造器约束,值类型/引用类型约束共四种约束。
显式约束并非必须,当没有指定显式约束时,泛型类型参数将只能访问 System.Object中的公有方法。
C#泛型及机制
泛型是通过参数化类型来实现在同一份代码上操作不同数据类型的编程
泛型示例:



























泛型在编译为IL代码和元数据时,采用特殊的占位符来表示泛型类型
CLR为所有类型参数为引用类型的泛型类型产生同一份IL代码
泛型方法
泛型机制只支持泛型方法,不支持在除方法外的其它成员(如属性














泛型约束
C#泛型要求对"所有泛型类型或泛型方法的类型参数"的任何假定
显式约束由Where子句表达,可以制定基类约束,接口约束
显式约束并非必须,当没有指定显式约束时,泛型类型参数将只能访问