当前位置:编程学习 > C#/ASP.NET >>

基于C#的泛型编程

1、引言
  泛型(Genericity)的概念并不是一个很新鲜的东西,C的模板(Templates)在多年前就被广泛使用,而且有了成熟的应用。泛型的功能类似于C的模板,它可以通过定义类型安全的数据结构,而不用使用实际的数据类型。泛型编程(Generic Programming)源起于C++语言对模板的支持,其中STL(Standard Template Library,标准模板库)是应用泛型技术编程的实现品中的佼佼者。随着近年来泛型理论的发展,泛型编程技术已经逐渐的成为一项通用技术,其他语言也在逐步实现对泛型编程的支持,在2.0版C#和CLR(Commom Language Runtime,公共语言运行库)中就实现了对泛型的支持。本文主要讨论泛型在C#中使用的一般性问题,了解泛型的一般性应用,从而对应用泛型开发思想写出简单、高效的C#应用程序提供帮助。
  2、泛型的概念
  所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型的第一个好处是编译时的严格类型检查。另外,泛型消除了绝大多数的类型转换。我们在编程过程中肯定遇到过这样的问题:多个函数的实现几乎一摸一样,就是只有某些参数不相同,但是我们没有办法把它们合二为一,只能分别写这些重复的代码。泛型编程可以完美地解决这些问题,它可以打破不同数据结构之间地壁垒,简化臃肿的程序代码。泛型编程就是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。
  3、程序的泛型性
  泛型程序的设计思想体现了一种共性与特性的关系,目标是在不影响运行效率的情况下将算法和数据结构等共性知识从具体的应用特性中脱离出来.。泛型的程序具有自身的诸多优点:⑴一般性:泛型的程序是一类问题共性的抽象,算法、数据结构和数据类型之间相互独立,可以使用更普遍。⑵安全性:泛型的程序定义类型安全的数据结构,不需使用具体的数据类型,避免类型故障而引起的系统灾难。⑶可靠性:泛型程序共性的正确可以保证所有特例的可靠。⑷效率性:泛型程序的普适性并不以效率的损耗为代价,它可以保证程序的运行效率和非泛型程序一样。
  4、C#中的泛型编程
  泛型将类型参数的概念引入.NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数 T,你可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险。在类实例化时指定实类型,运行时(Runtime)自动编译为本地代码,运行效率和代码质量都有很大提高,并且保证数据类型安全。
  创建一个泛型类,能够类型参数化得越多可以使代码尽量的精简、灵活且重用型更好,但是更多的类型通用化可能使整个程序更加的晦涩难懂,其他程序员为了读懂你的程序可能要花费更多的精力和时间。约束的使用也是必要的,而且需要你对泛型类应用尽可能多的约束,但仍使您能够处理需要处理的类型。如果程序员使用了错误的参数类型,那么程序还是能够正常编译。只有在运行到这段代码时,才会报错,这将会使你的程序陷入危险之中。创建一个泛型类的一般过程可以概括为:从一个已建的具体类开始,逐一的把每个类型改为类型参数,再加上必要的约束,直至达到通用和可用的最佳平衡。
  在我们编写泛型类的时候,我们可能有对实例化类时用于类型参数T的类型种类加以限制的需求。这里就要用到泛型类的约束,使客户端代码尝试使用某个约束所不允许的类型来实例化类时会产生编译时错误。C#通过使用where关键字来指定约束。
  泛型使用在类的方法上与使用在类上具有相似之处。它可以参数化方法中使用的数据类型,我们来看下面的代码:
  public class Tlist{
  public T[] list;
  public int i;
  public Tlist(){
  list=new T[10];
  i=0;
  }
  public T Objout(){
  return list[--i];
  }
  public void Objin(T item){//方法一
  list[i++]=item;
  }
  }
  public class Tlist_s{
  public void Objin(Tlist s,params T[] p)//方法二
  {
  foreach (T t in p)
  s.Objin(t);
  }
  }
  Tlist T1=new Tlist();
  Tlist_s T2=new Tlist_s();
  T2.Objin(T1,2,3,4,5);//调用一
  方法一把单个T类型的item变量放入list数组中,而方法二则是把多个T类型变量放入list数组,如上例的调用一就是把int型2,3,4,5四个元素放入list数组中,方法二就是泛型方法。
  5、总结
  C#的泛型和其他语言的泛型相比,有它的优胜之处,它具有好的二进制重用性。C++的泛型依靠的是它的编译器提供的特性,在编译C++泛型代码时将实类型替换类型参数,这样的话可能就会引起代码的膨胀的问题。而在C#中,泛型代码是由JIT(Just-In-Time,编译器,把MSIL代码编译为专用于操作系统和目标机器的本机代码)即时编译,CRL(Commom Language Runtime,公共语言运行库)可以重用大部分不同类型即时编译的代码。
  参 考 文 献
  [1]Anders Hejlsberg, Scott Wiltamuth.C # Programming Language[M].New York:Addison Wesley,2003.
  [2]孙斌.面向对象、泛型程序设计与类型约束检查[J].计算机学报,2004
  [3]薛锦云.程序设计方法[M].北京:高等教育出版社,2005.
  [4]LIPPMAN S B.LAJOIE J.MOO B E C++ primer,2006
  [5]Austern M H.Generic programming and STL[M].Es易做图 :Addison2Wesley Longmax,1999.
  [6]John Sharp. Visual C# 2005从入门到精通.清华大学出版社,2006
  [7]刘洪成.C#高级编程.清华大学出版社.2003

    
补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,