泛型将 类型参数 的概念引入了 .NET Framework。
泛型主要有两个优点:
1、编译时可以保证类型安全。
2、不用做类型转换,获得一定的性能提升。
泛型方法、泛型委托、泛型接口
除了泛型类之外,还有泛型方法、泛型委托、泛型接口:
泛型委托:
//泛型委托 public delegate void Del<T>(T item); //声明一个泛型委托 public static void Notify(int i) { } //定义一个方法 Del<int> m1 = new Del<int>(Notify); //用委托代替定义的方法
泛型接口:
//泛型接口 interface MyInteface<T1, T2, T3> { T1 Method1(T2 param1, T3 param2); } public class MyClass<T1, T2, T3> : MyInteface<T1,T2,T3> { public T1 Method1(T2 param1, T3 param2) { throw new NotImplementedException(); } }
泛型方法:
//泛型方法 public void Swap<T>(ref T t1, ref T t2) { T temp = t1; t1 = t2; t2 = temp; } public void Interactive() { string str1 = "a"; string str2 = "b"; Swap<string>(ref str1, ref str2); Console.WriteLine(str1 + "," + str2); }
泛型约束:
可以给泛型的类型参数上加约束,要求这些类型参数满足一定的条件:
约束 | 说明 |
where T : struct | 类型参数需是值类型 |
where T : class | 类型参数需是引用类型 |
where T : new() | 类型参数要有一个 public 的无参构造函数 |
where T : <base class name> | 类型参数要派生自某个基类 |
where T : <interface name> | 类型参数要实现某个接口 |
where T : U | 这里 T 和 U 都是类型参数,T 必须是或者派生自 U |
泛型例子
public class List<T> { }
其中,T 就是 System.Collections.Generic.List<T> 实例所存储类型的占位符。
当定义泛型类的实例时,必须指定这个实例所存储的实例类型。