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 制定成返回值
}
解释:
另,参数列表支持多个参数。如下:
public class 类名
2.3.2.2 约束
确保泛型类使用的参数是提供特定方法的类型。
public class GenericList
假如IEmployee接口包含A方法,编译器会验证用于替换T的类型一定要实现IEmployee接口。
2.3.2.3 用法
使用泛型类很简单,只要在类名称的后面加上由一对尖括号构成的实参列表就行了。如下:
GenericList
GenericList
GenericList<类名> list3 = new GenericList<类名>();
GenericList<类名
2.3.3 泛型方法(泛型函数。C++中叫函数模板)
2.3.3.1 定义
//定义泛型方法
static void Swap
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
2.3.3.2 用法
//使用泛型方法
public static void TestSwap()
{
int a = 1;
int b = 3;
Swap
string s1 = "Hello";
string s2 = "world";
Swap
}
最后,希望和大家一起共同进步。我的email: dreamerate@gmail.com,和您深入讨论MASM32/C++/C#。
- dotNET下的泛型编程
- dotnet下的采集
- dotNet下ActiveX的开发
- DotNet下简单的程序部署
- dotNet C# 下的全局钩子问题
- 如何使用串口控件MSComm在dotNet下编程
- Dotnet环境下的crystal report的部署(下)
- DotNET异步编程
- dotnet 网络编程 tcp
- dotnet编程C#语言的Split函数的各种用法
- Dotnet环境下的crystal report的部署(上)
- WIN98下运行DOTNET程序的一些问题
- DotNet(.Net)下构建高适应性的三层架构
- 谈DotNet解决方案下分层和子项目的划分
- 谈DotNet解决方案下分层和子项目的划分
- DotNet解决方案下分层和子项目的划分
- 谈DotNet解决方案下分层和子项目的划分
- DotNet(.Net)下构建高适应性的三层架构
- C#抽象工厂模式的几种实现方法及比较
- 利用 Oracle 10g 技能学习 DB2 9.1 for Linux, UNIX and Windows
- VC 时间操作实例
- 测试时代论坛中测试新手的职业发展困惑
- 35岁前成功的12条黄金法则
- dotNET下的泛型编程
- ASP.NET2.0轻松搞定统计图表【月儿原创】
- NetBeans Mobility Pack 5.5 快速入门
- Java连接SQL Server 2000
- 一条Linux命令,一段人类文明
- 勇敢的走下去
- 漫谈创业和管理-程序员5大思维障碍
- 短信平台2007版
- DNS,路由