程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 基於C#的泛型編程

基於C#的泛型編程

編輯: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].Essex :Addison2Wesley Longmax,1999.
  [6]John Sharp. Visual C# 2005從入門到精通.清華大學出版社,2006
  [7]劉洪成.C#高級編程.清華大學出版社.2003

    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved