C#泛型
C#中的泛型能够将类型作为参数来传递,即在创建类型时用一个特定 的符号如“T”来作为一个占位符,代替实际的类型,等待在实例化时 再用一个实际的类型来代替。
泛型的优点
- 使用泛型可以的重用代码,保护类型的安全以及提高性能
- 降低强制转换或装箱操作的成本和风险
- 可以对泛型参数进行限定以访问特定数据类型的方法
基本语法
//使用静态方法交换a和b的值,运用泛型
class Program
{
static void Main(string[] args)
{
double a = 10;
double b = 20;
Tool.Swap<double>( ref a, ref b);//使用泛型
Console.WriteLine(a);
Console.WriteLine(b);
}
}
public class Tool
{
public static void Swap<T>(ref T value0, ref T value1)//泛型定义
{
T temp= value0;
value0 = value1;
value1 = temp;
}
}
输出结果
泛型类型参数注意点
- 泛型类型参数可以有多个
- 泛型类型参数可以是编译器识别的任何数据类型
- 泛型类型参数命名需要遵守命名规则
(1) 使用描述性名称命名泛型类型,并且使用T作为前缀
(2) 单个字母名称完全可以让人了解其表示的含义使用单个大写字母命名
泛型类型参数常用的约束类型
1.where T:struct :表示泛型T是值类型(小数,整数,char,bool, struct)
2.where T:class :表示泛型T是引用类型
4. where T:new() :表示这个泛型具有一个无参数的构造方法,如果有 多个约束,new()必须放在最后
5. where T:基类名 :表示这个泛型是该基类或者其派生类
6. where T:接口名 :表示泛型是实现了该接口的类型
定义示例:
public static void Swap<T,Y>(T value0,Y value1)where T:struct where Y:struct
{
..................
}
泛型方法
泛型方法是使用泛型类型参数声明的方法,当方法中存在某些参数的 类型不明确的时候就可以使用泛型方法。未知具体类型的参数就使用 泛型类型参数替代
public static string CombineToString<T>(T value1,T value2)
{
return value1.ToString () + value2.ToString ();
}
public static void Main(string[] args)
{
Console.WriteLine(CombineToString<int> (234,56));
}//结果输出为:23456
泛型类
泛型类封装了不是特定于具体数据类型的操作,当类中存在未知参数 类型的时候就可以使用泛型类
格式:
修饰符 class 类名<泛型类型参数>{ 类成员
}
例如:
class BaseNodeGeneric<T> { }
泛型类实例化
BaseNodeGeneric<int> bng0 = new BaseNodeGeneric<int> ();
BaseNodeGeneric<string> bng1 = new BaseNodeGeneric<string> ();
泛型类设计规则
- 将哪些类型通用化为泛型类型参数
- 如果存在约束,应对泛型类型参数应用什么约束
- 是否将泛型行为分解为基类和子类
- 是否实现一个或多个泛型接口