我们在编写程序时经常遇到两个模块的功能非常相似,只是因为参数类
型不同,所以分别写多个方法处理每种数据类型,因为方法的参数类型
不同没法重用同样功能的代码。。例如:
public static void Swap(ref int num1,ref int num2){
Console.WriteLine ("SwapIntFunc");
}
public static void Swap(ref double num1,ref double num2){
Console.WriteLine ("SwapDoubleFunc");
}
public static void Swap(string num1,string num2){
Console.WriteLine ("SwapStringFunc");
2. 降低强制转换或装箱操作的成本和风险
3. 可以对泛型参数进行限定以访问特定数据类型的方法
型不同,所以分别写多个方法处理每种数据类型,因为方法的参数类型
不同没法重用同样功能的代码。。例如:
public static void Swap(ref int num1,ref int num2){
Console.WriteLine ("SwapIntFunc");
}
public static void Swap(ref double num1,ref double num2){
Console.WriteLine ("SwapDoubleFunc");
}
public static void Swap(string num1,string num2){
Console.WriteLine ("SwapStringFunc");
}
我们可以采用根类Object,来解决这个问题:
public static void Swap(object obj1,object obj2){
Console.WriteLine ("SwapObj");
Console.WriteLine (obj1.ToString () + obj2.ToString ());
}
但是采用Object存在以下缺陷:
1 会出现装箱、折箱操作,这将在托管堆上分配和回收大量的变量,若
数据量大,则性能损失非常严重
2 在处理引用类型时,虽然没有装箱和折箱操作,但将用到数据类型的
强制转换操作,增加处理器的负担
C#中的泛型能够将类型作为参数来传递,即在创建类型时用一个特定
的符号如“T”来作为一个占位符,代替实际的类型,等待在实例化时
再用一个实际的类型来代替:
public static void Swap<T>(ref T value0,ref T value1){
T temp = value0;
value0 = value1;
value1 = temp;
}
泛型的优点
2. 降低强制转换或装箱操作的成本和风险
3. 可以对泛型参数进行限定以访问特定数据类型的方法
泛型类型参数
在泛型类型或方法定义中,类型参数是客户端在实例化泛型类型的
变量时指定的特定类型的占位符。在上面例子泛型方法当中T即为泛
型类型参数。
泛型类型参数注意点
1. 泛型类型参数可以有多个
2. 泛型类型参数可以是编译器识别的任何数据类型
3. 泛型类型参数命名需要遵守命名规则
(1) 使用描述性名称命名泛型类型,并且使用T作为前缀
(2) 单个字母名称完全可以让人了解其表示的含义使用单个大写字母命名