学习《深入理解C#》—— 泛型 (第三章3.1---3.2)
泛型是什么?
泛型(generic)是C# 2.0和通用语言运行时(CLR)的一个新特性。泛型为.NET框架引入了类型参数(type parameters)的概念。类型参数使得设计类和方法时,不必确定一个或多个具体参数,其具体参数可延迟到客户代码中声明、实现。
为什么需要泛型?
在C#1中,我们的代码中存在大量的强制转换,特别是那些大量使用集合中,几乎每次使用foreach都要隐式的强制转换。只要将 object 作为参数类型或返回类型使用时,就可能涉及强制类型转换。比如下面的需求:
假如我们要写一个比较两个整数大小的方法时,我们可能很快会写出下面的代码:
public static int ComparerInt(int i, int j) { if (i.CompareTo(j) > 0) { return i; } return j; }
如果我们需求改变了,又要比较两个字符串的大小时,我们不得不又要编写一个比较字符串的方法。
public static string ComparerString(string str1, string str2) { if (str1.CompareTo(str2) > 0) { return str1; } return str2; }
如果我们的需求又改了,比较两个double类型的大小,那我们又编写一个比较double类型的方法吗? 从上面的代码中可以看出,方法比较的只是比较的类型不一样,比较的方式都是一样的,这时我们想一想有没有一种通用的比较方式呢?可以把任何类型当做参数传入到这个类型中去实例化为具体类型的比较,同时微软在C#2.0中也想到了这个问题,所以就导致了C#2.0中添加了泛型这个新的特性,泛型就是——通用类型,有了泛型之后就可以很好的帮助我们解决上述的问题。
public class CompareGeneric<T> where T : IComparable { public static T Compare(T t1, T t2) { if (t1.CompareTo(t2) > 0) { return t1; } else { return t2; } } }
这样我们就不需要针对每个类型实现一个比较方法,我们可以通过下面的方式在主函数中进行调用的:
class Program { static void Main(string[] args) { Console.WriteLine(Compare<int>.CompareGeneric(3, 4)); Console.WriteLine(Compare<string>.CompareGeneric("qwer", "tyu")); Console.Read(); } }
泛型类型和类型参数
泛型有两种形式:泛型类型(包括类、接口、委托和结构——没有泛型枚举)和泛型方法。类型参数是真实类型的占位符。在泛型声明中,类型参数要放在一对尖括号内,并以逗号分隔。在 Dictionary <TKey,TValue> 中,类型参数是 TKey 和 TValue 。使用泛型类型或方法时,要用真实的类型代替。这些真实的类型称为类型实参(type argument)。我们已习惯于方法的参数和返回值有固定的类型,而且已看到了泛型类型如何在它的方法声明中使用类型参数。泛型方法则更进一步,即使你已经确切地知道要操作哪一个已构造类型,泛型方法也可以有类型参数。
这篇就写到这里。下篇我们将继续学习《深入理解C#》的相关知识。谢谢!