a、可在各CLR语言之间无缝结合;
b、不会像C++产生代码膨胀问题;
c、也不会像Java的“假”泛型一样在性能上无所提升;
d、对于值类型,每种值类型实例化一份,对于引用类型,只实例化为同一份代码。
2、泛型类的要求
class A <T1,T2>{}//合法
class B:C <string,int>{} //合法
class D<U,V>:C<U,V>{} //合法
class E<U,V>:C<string,int>{} //合法
class G:C<U,V>{} //非法
/*
总之就是父类的类型参数要么从子类得到确定,如第三个,要么已经确定,如第四个,第五个的父类不能确定类型参数
*/
3、泛型类可以成为其它类的成员class B:C <string,int>{} //合法
class D<U,V>:C<U,V>{} //合法
class E<U,V>:C<string,int>{} //合法
class G:C<U,V>{} //非法
/*
总之就是父类的类型参数要么从子类得到确定,如第三个,要么已经确定,如第四个,第五个的父类不能确定类型参数
*/
class C<T>
{
}
class D<T>
{
public C<T> c;
public void DoThings()
{
c.ToString();//没有用约束时,只能用object型的方法。
}
}
4、泛型接口的要求同2点{
}
class D<T>
{
public C<T> c;
public void DoThings()
{
c.ToString();//没有用约束时,只能用object型的方法。
}
}
interface IList<T>{T[] GetElements();}
interface IDictionary<T1,T2>
{
void Add(T1 key, T2 value);
}
class List<T>:IList<T>,IDictionary<string,T>
{
public T[] GetElements(){}
public void Add(string key, T value){}
}
5、泛型委托interface IDictionary<T1,T2>
{
void Add(T1 key, T2 value);
}
class List<T>:IList<T>,IDictionary<string,T>
{
public T[] GetElements(){}
public void Add(string key, T value){}
}
delegate bool Predicate<T>(T value);
class C
{
static bool F(int i ){}
static bool G(string s){}
static void Main()
{
Predicate<string> p1 = G;//C#2.0新语法
Predicate<int> p2 = new Predicate<int>(F);//旧式语法写法
}
6、泛型方法--在方法声明上包含类型参数class C
{
static bool F(int i ){}
static bool G(string s){}
static void Main()
{
Predicate<string> p1 = G;//C#2.0新语法
Predicate<int> p2 = new Predicate<int>(F);//旧式语法写法
}
a、C#不支持泛型索引、属性、事件、构造、析构,但这些成员可以使用类的泛型参数;
b、泛型方法可以用在泛和非泛类中
public class Finder
{
public static Find<T>(T[] items, T item)
{
for(int i = 0 ; i < items.length ; i++)
{
if(items[i].Equal(item))return i;
}
return -1;
}
}
int i = Finder.Find<int>(new int[]{1,2,3,4,5},2);
c、泛型方法重载要求{
public static Find<T>(T[] items, T item)
{
for(int i = 0 ; i < items.length ; i++)
{
if(items[i].Equal(item))return i;
}
return -1;
}
}
int i = Finder.Find<int>(new int[]{1,2,3,4,5},2);
void F1<T>(T[] a,int i);
void F1<U>(U[] a,int i); // Can't
void F2<T>(int i );
void F2(int i ); //yes
void F3 <T>(T t) where T:A
void F3 <T>(T t) where T:B //Can't
d、泛型方法的重写void F1<U>(U[] a,int i); // Can't
void F2<T>(int i );
void F2(int i ); //yes
void F3 <T>(T t) where T:A
void F3 <T>(T t) where T:B //Can't
abstract class Base{
public abstract T Function<T,T1>(T t, T1 t1)where T1:T;
public abstract T Function2<T> (T t) where T:IComparable;
}
class Derived:Base{
public override string Function<string,int>(string s, int i){}
public override string Function2<string> (string s) where string:IComparable{}//非法,重载无需声明约束
}
7、泛型约束--C#泛型的类型安全特点--要求显式的约束public abstract T Function<T,T1>(T t, T1 t1)where T1:T;
public abstract T Function2<T> (T t) where T:IComparable;
}
class Derived:Base{
public override string Function<string,int>(string s, int i){}
public override string Function2<string> (string s) where string:IComparable{}//非法,重载无需声明约束
}
a、基类约束
class Base{public void F1(){}}
class Derived<T> where T:Base{
public void F2(T t)
{
t.F1();//通过约束,能直接调用Base的方法
}
}
class Derived<T> where T:Base{
public void F2(T t)
{
t.F1();//通过约束,能直接调用Base的方法
}
}
b、接口约束
interface I1{void F1();}
class C<T> where T:I1
{
//可以调用T继承的I1的F1方法
}
class C<T> where T:I1
{
//可以调用T继承的I1的F1方法
}
c、构造器约束
class A{public A(){}}
class B{public B(int i){}}
class C<T> where T:new()
{
//可以直接用T t = new T();实例化一个对象
}
C<A> c = new C<A>();//合法
C<B> c1 = new C<B>();//非法
class B{public B(int i){}}
class C<T> where T:new()
{
//可以直接用T t = new T();实例化一个对象
}
C<A> c = new C<A>();//合法
C<B> c1 = new C<B>();//非法
d、值/引用类型约束
public struct A{}
public class B{}
public class C<T> where T:struct{}
C<A> c = new C<A>();//合法
C<B> c1 = new C<B>(); //非法
public class B{}
public class C<T> where T:struct{}
C<A> c = new C<A>();//合法
C<B> c1 = new C<B>(); //非法