dotNET下的泛型编程

来源:互联网 发布:数据库的第三范式 编辑:程序博客网 时间:2024/06/04 18:31

dotNET下的泛型编程

1、什么是泛型编程(generic programming)?

即通用的程式设计。什么是通用的程式设计呢?学数据结构的都知道,存在一个这样的公式:

      程序 = 算法 + 数据结构

这个经典的公式简单地描述了一个程序的由来,即使您的程序有多么的复杂。在OOP还没有出现之前,算法和数据结构所占的份量几乎是同等的。C语言就是一个这样的主导的开发模式。

而泛型呢?则把算法放在主导位置,中间忽略了大量的数据结构中存在的差异产生的分岐。而我们完全可以把所有时间和精力主要集中在研究算法上,而不会为了支持各种各样的数据结构,而导致做大量的无意义的低效的工作了。这是一种very smart的开发模式!也是比较科学的解决方案(会心一笑)。在以后的编程中,我们应该不断的提倡使用泛型,主要把时间集中在算法的研究及改进,提供最有效的算法,目的是为了开发最好的软件给用户。用户的放心,也是我们的开心。


2、泛型如何实施?

2.1 哪些程式设计语言支持泛型?

比如说我们要写一个Array类,要让它支持所有的内置类型(int/string/double etc...),一般的程序员,可能会想到为每一种内置类型都编写一个同样的类(天哪!罗马工程!),稍聪明一点的,会想到把相同的代码提出来封装成一个个函数供调用(这样做也会导致代码阅读困难,因为call太多了,跟踪的工程浩大,并且函数的调用也会相应地牺牲一些系统性能);而通常C语言的高手可能会采用指针或是union来做(容易出错及较低级,实施困难);而有OO概念的,可能就会考虑采用“祖先类”来设计(也容易出错及在类型转换时会导致系统性能下降,而dotNET则会产生装箱和拆箱的冗余操作);那些都是在不支持泛型的语言下的唯一方案,你别无选择。

很幸运地,聪明的编译器制造者给我们带来了泛型编程!哪些语言支持泛型呢?由于在下才舒学浅,只会MASM32/C/C++/VB/C#/VB.NET。在那几种最新版本的语言中,C++和dotNET都相应有了泛型的支持。C++有template(模板),功能强大!本人的最爱;而dotNET也不甘落后,比尔给我们带来了System.Collections.Generic名字空间。

在这里,我们要讲的是dotNET下的泛型编程。C++在本人的BLOG中,也有相应的template文章。不过我还是推荐大家看《C++Primer》,这是一本巨好的书!简直就是C++中的鬼斧神工圣经级书籍。选择什么版本呢?当然,英文好的读原版,而后者则推荐“潘爱民和张丽”翻译的版本。翻译的质量你不用怀疑,错误极少,措辞也极优美,阅读很畅通,总之质量很高,虽然有小许瑕疵,不过那些可能是原版所造成的吧?本人只发现P144中,名字空间域操作符“::”漏了一个冒号。


2.2 由object类型(dotNET的祖先类)所构成的通用程式设计

回顾object类型,它支持以下行为:

1)object可以来引用任何类型的实例;
2)object类型可以存储任何类型的值(简单类型就是一个值,复杂的就是一个指针);
3)可以定义object类型的参数;
4)可以把object作为返回类型。

绝大多数从C/VB/DELPHI等语言转过来的dotNET程序员,一般都是用object类型来编写通用的程序方法。当然,object用来编写这种框架,既简单又方便,但是却因此,会引来装箱和拆箱的操作及类型转换所造成的系统开销,这在实施大型系统时,是我们最不想看到的结果。


2.3 .NET Framework 2.0 中的泛型设计

2.3.1 泛型的引入

终于,在Framework 2.0中,一些喜爱C++的Microsoft的工程师给我们带来了和C++差不多的泛型设计。这是非常可喜可贺的。这个主要的目的就是为了避免在强制类型转换,及减少装箱拆箱提高性能,减少错误。

System.Collections.Generic命名空间提供许多集合类和接口的泛型版本:有泛型类,泛型接口,泛型方法,泛型委托。在这里我们只介绍泛型类和泛型方法。泛型接口可参考泛型类,泛型委托参考泛型方法。都很简单。

2.3.2 泛型类(C++中叫类模板)

2.3.2.1 定义

要定义一个泛型类很简单,只要在类名称的后面加上由一对尖括号构成的参数列表就行了。如下所示:
 
public class GenericList
{
    public void Add(T input); // T 制定成类型参数
    public T Add();  // T 制定成返回值
}

解释:的T是类型参数,起占位符的作用,编译时被真正类型取代。

另,参数列表支持多个参数。如下:
public class 类名

2.3.2.2 约束

确保泛型类使用的参数是提供特定方法的类型。

public class GenericList where T : IEmployee

假如IEmployee接口包含A方法,编译器会验证用于替换T的类型一定要实现IEmployee接口。

2.3.2.3 用法

使用泛型类很简单,只要在类名称的后面加上由一对尖括号构成的实参列表就行了。如下:

GenericList list1 = new GenericList();
GenericList list2 = new GenericList();
GenericList<类名> list3 = new GenericList<类名>();
GenericList<类名> list4= new GenericList<类名>();


2.3.3 泛型方法(泛型函数。C++中叫函数模板)

2.3.3.1 定义

//定义泛型方法
static void Swap(ref T lhs, ref T rhs)
{
   T temp;
   temp = lhs;
   lhs = rhs;
   rhs = temp;
}

2.3.3.2 用法

//使用泛型方法
public static void TestSwap()
{
   int a = 1;
   int b = 3;
   Swap(ref a, ref b);

   string s1 = "Hello";
   string s2 = "world";
   Swap(ref s1, ref s2);
}

最后,希望和大家一起共同进步。我的email: dreamerate@gmail.com和您深入讨论MASM32/C++/C#。


 
原创粉丝点击