国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

深度剖析C#泛型的使用

開發 后端
本文從C#泛型的概念、創建和使用等方面深度剖析了C#泛型的創建和使用,供大家參考。

 "一次編碼,多次使用",這就是引入泛型的根源。在以前的C++中稱為模板,C#泛型通過算法和數據結構支持獨立編碼。例如,泛型列表意味著,你不必再重寫一個強類型集合。在本文中,作者將向你展示定義和使用泛型是多么容易的事情-請注意,長期以來泛型一直被認為是***級和最困難的術語。

一、簡介

泛型現在在任何一種語言中都被認為是一個高級的強有力的術語。當我在C++中***次接觸模板時,我對之有些疑惑。之后,我讀了Bjarne Stroustrop的《The Design and Evolution of C++》,才發現模板的使用就象C中的宏和用之來取代的簡單串替換模板一樣容易。其實,模板和泛型是相同的東西-盡管它們的實現稍微不同。

C#泛型支持在使用點處才定義算法及其數據類型。在C#的一些早期版本中,我們可以證明沒有泛型也可以工作,因為每種類型都是派生于一個公共基類型-object。這意味著程序員可以基于object類型定義一個棧類并且把一切東西放到該棧上(因為一切都派生于object)。然而,一個object棧意味著,Customer對象,Integer對象以及假想的對象都能被放置到同一個棧的實例上。結果是,開發者要子類化數據類型來把數據類型綁定到他們要與之交互的東西上去。例如,在編寫定制的商業對象時,我們就建議定義派生于System.Collections.CollectionBase的強類型集合。原因很簡單:基于object定義一切被認為是弱類型定義。

業界的高手們在數十年前就確信強類型優于弱類型,所以.NET最終支持強類型,這看上去是很自然的事情。強類型算法當然建議類型化參數-這正是我們在泛型中所用的東西。

十幾年來,我們一直在使用字母T作為類型化參數的名字。這樣,在任何泛型類使用者所提供的數據類型的地方,你都能夠找到T。使用泛型的關鍵僅僅是提供這個T。定義泛型的關鍵在于實現一個方法或類,并且用特定數據類型來替換掉T。

C#泛型支持另外一些提煉。例如,一個方法或類可以有多個參數化的類型并且C#泛型還支持WHERE約束-它用來具體要求類型化參數的類型。例如,如果一個泛型類型必須實現接口IDisposable,那么C#泛型是支持實現這一限制的。在文章的***我們還要看一下約束問題。

閑話少說,讓我們言歸正傳。

二、使用泛型集合

有些人問我"面向對象編程(OOP)的承諾在哪里?",我的回答是應該從兩個方面來看OOP:你所使用的OOP和你創建的OOP。如果我們簡單地看一下如果沒有如例如Microsoft的.NET,Borland的VCL,以及所有的第三方組件這樣的OO框架,那么很多高級的應用程序幾乎就無法創建。所以,我們可以說OOP已經實現了它的承諾。不錯,生產好的OOP代碼是困難的并且可能是***挫敗性的;但是記住,你不必須一定要通過OOP來實現你的目標。因此,下面首先讓我們看一下泛型的使用。

當你用Visual Studio或C# Express等快速開發工具創建工程時,你會看到對于System.Collections.Generic命名空間的參考引用。在這個命名空間中,存在若干泛型數據結構-它們都支持類型化的集合,散列,隊列,棧,字典以及鏈表等。為了使用這些強有力的數據結構,你所要做的僅是提供數據類型。

列表1顯示出我們定義一個強類型集合的Customer對象是很容易的。

列表1 這個控制臺應用程序包含一個Customer類和一個基于List< T>的強類型集合Customers。

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. namespace Generics{  
  5.  class Program{  
  6.   static void Main(string[] args){  
  7.    List< Customer> customers = new List< Customer>();  
  8.    customers.Add(new Customer("Motown-Jobs"));  
  9.    customers.Add(new Customer("Fatman's"));  
  10.    foreach (Customer c in customers)  
  11.    Console.WriteLine(c.CustomerName);  
  12.    Console.ReadLine();  
  13.   }  
  14.  }  
  15.  public class Customer{  
  16.   private string customerName = "";  
  17.   public string CustomerName{  
  18.    get { return customerName; }  
  19.    set { customerName = value; }  
  20.   }  
  21.   public Customer(string customerName){  
  22.    this.customerName = customerName;  
  23.   }  
  24.  }  

注意,我們有一個強類型集合-List< Customer>-對這個集合類本身來說不需要寫一句代碼。如果我們想要擴展列表customer,我們可以通過從List< Customer>繼承而派生一個新類。

三、 實現一個泛型類

一種合理的實現某種新功能的方法是在原有的事物上進一步構建。我們已經了解強類型集合,并知道一種不錯的用來構建泛型類的技術是使用一個特定類并刪除數據類型。也就是說,讓我們定義一個強類型集合CustomerList,并且來看一下它要把什么東西轉化成一個泛型類。

列表2定義了一個類CustomerList。后面的部分把CustomerList轉化成List< T>。

列表2定義類CustomerList:

  1. using System;  
  2. using System.Collections;  
  3. using System.Text;  
  4. namespace Generics{  
  5.  public class CustomerList : CollectionBase{  
  6.   public CustomerList() { }  
  7.   public Customer this[int index]{  
  8.    get { return (Customer)List[index]; }  
  9.    set { List[index] = value; }  
  10.   }  
  11.   public int Add(Customer value)  
  12.   {return List.Add(value);}  
  13.  }  

四、 定義類頭

如果我們定義一個泛型類,我們需要把類頭轉化成一個泛型類。所有我們需要做的是命名參數并且把類名改成某種泛型。List< T>只有一個參數T,并且因為我們在以一種向后兼容的方式工作,所以我們知道類名是List。列表3顯示出列表2中類的新類頭。

列表3 一個泛型類頭顯示出參數化的參數T。

  1. using System;  
  2. using System.Collections;  
  3. using System.Text;  
  4. namespace Generics{  
  5. public class List< T> : CollectionBase {} 

五、 實現泛型字段

如果我們需要把任何字段轉換成泛型字段,我們將只需簡單地把它們的類型改變成T(或該字段所描述的任何參數)。泛型List不需要任何字段,但是假定存在一個私有的整型字段叫foo-我們將把它泛型化。我們將如下重新定義它:

  1. private T foo; 

當參數T被填充到類中時,List T也將因foo被填充。

六、 定義泛型方法

接下來,我們為所需要的參數化類型定義其它一些特性。這包括屬性,方法,和事件。在我們的實例中,在Customer出現的每一處,我們都用參數T替換它。完成后的泛型列表類顯示于列表4中。

列表4 一個基于System.Collections.CollectionBase的輕量級的參數化泛型列表類。

  1. using System;  
  2. using System.Collections;  
  3. using System.Text;  
  4. namespace Generics{  
  5.  public class List< T> : CollectionBase {  
  6.   public List(){ }  
  7.   public T this[int index] {  
  8.    get { return (T)List[index]; }  
  9.    set { List[index] = value; }  
  10.   }  
  11.   public int Add(T value) {  
  12.    return List.Add(value);  
  13.   }  
  14.  }  

為了測試該定制列表,注釋掉使用System.Collections.Generic命名空間一句并且把列表4中的List< T>使用在列表1的代碼中;它將以同樣的方式工作。

全面地修改.NET的List< T>是不必要的而且它也包含遠比我們的示例多得多的特性;但是列表4顯示出這種機制對于定義定制泛型類是多么容易。 

七、 增加類型約束

***要討論的是約束問題。約束被應用于類或其它特性上并且使用下面的語法:

  1. Where T : constraint_type 

例如,任何我們想要通過using語句所使用的,如一個SqlDataReader,必須實現Idisposable接口。這是因為如下方式使用的using語句:

  1. using(Form f = new Form()){...} 

就象一個try..finally塊一樣工作-總是清除新創建的資源。其工作原理很簡單,只需要CLR針對在該using語句中創建的對象發出一個到IDisposable.Dispose的調用即可。例如,在上面這一句中,一個新的表單被創建,并且在using語句退出之前即調用Form.Dispose。

要對一個泛型類施加以確保該類實現了接口IDisposable,我們將添加先行詞where T:Idisposable。在列表4中的泛型列表上施加約束后,我們將重新修改列表4如下面的列表5所示。

列表5 增加一個約束到泛型類以確保我們的List< T>中的所有的值T實現接口Idisposable。

  1. using System;  
  2. using System.Collections;  
  3. using System.Text;  
  4. namespace Generics{  
  5.  public class List< T> : CollectionBase where t : IDisposable{  
  6.   public List(){ }  
  7.   public T this[int index]{  
  8.    get { return (T)List[index]; }  
  9.    set { List[index] = value; }  
  10.   }  
  11.   public int Add(T value){return List.Add(value);}  
  12.  }  

先行詞where的值可以是類,接口,結構,實現一個無參的公共構造器或有一個特定的基類的類。詳見有關幫助文檔。

八、 總結

C#泛型的設計是用來減少你重復實現的代碼的次數-只需改變數據類型即可。因為抽象數據結構,如隊列,棧和列表皆是典型的數據結構,所以存在針對這些東西的泛型類完全可以理解。你可以從.NET中派生大量的值-通過使用現有的泛型類,如在System.Collections.Generic命名空間中的那些。

可以肯定,在一段相當長的時間里,泛型將會象模式和重構等革新一樣對開發帶來越來越大的價值,而且新的數據結構能被轉換成可重用的如泛型等的代碼元素。

【編輯推薦】

  1. 淺析C#啟動停止SQL數據庫服務之方法
  2. VB.NET與C#語言之間的比較分析
  3. C# override重寫與new隱藏的區別
  4. 詳述C#泛型集合相關內容
  5. 從Socket看Visual C#.Net網絡程序開發
責任編輯:book05 來源: cnblogs
相關推薦

2009-06-24 10:25:25

C#泛型

2009-08-24 14:43:35

C# 泛型

2009-08-26 09:36:03

C#泛型

2009-08-24 15:28:19

C# 泛型方法

2009-08-24 10:29:39

C# 泛型

2013-03-20 09:27:33

C#泛型

2009-09-02 17:38:16

C#泛型支持

2009-08-24 15:12:13

C# 泛型接口

2009-08-24 18:15:24

C# Dictiona

2009-08-28 11:16:51

C#日期型數

2009-08-24 15:38:21

C# 泛型數組

2009-08-24 14:51:25

C# 泛型泛型類型

2009-08-24 14:20:13

C# 強制類型轉換

2009-08-24 10:07:57

C#泛型處理

2009-08-24 17:58:19

C# 泛型集合

2009-08-24 16:39:19

C# 泛型應用

2009-08-24 17:27:05

C#泛型應用

2009-08-24 11:35:20

C# 泛型應用

2009-08-26 18:02:05

C#泛型問題

2009-08-24 15:50:23

C# 泛型C# 泛型委托
點贊
收藏

51CTO技術棧公眾號

日韩在线观看www| 日韩在线电影| 91在线免费视频观看| 97精品国产aⅴ7777| 麻豆视频在线播放| 中文字幕+乱码+中文字幕一区| 成人免费一区二区三区视频| 能在线观看的av网站| 日韩在线综合| 亚洲无限av看| 97碰碰碰免费公开在线视频| 自拍一区在线观看| 欧美影院一区二区三区| 亚州精品一二三区| 热久久国产精品| 26uuu亚洲伊人春色| 99riav视频在线观看| 精品亚洲成a人| 日本午夜精品理论片a级appf发布| 好吊日视频在线观看| 欧美一级久久| 欧美三级蜜桃2在线观看| 无遮挡又爽又刺激的视频| 亚洲黄色天堂| 久久精品日产第一区二区三区乱码| 国产一区一区| 欧美日韩夫妻久久| 在线国产三级| 国产精品欧美久久久久无广告| 国产成人永久免费视频| 天堂va蜜桃一区二区三区漫画版| 91久久久久久国产精品| 红桃成人av在线播放| 欧美一级成年大片在线观看| 日本一区二区三区视频在线看| 在线播放国产一区中文字幕剧情欧美| aa国产成人| 日韩av在线网| 国模冰冰炮一区二区| 亚洲美女自拍视频| 午夜精品成人av| 视频在线观看一区二区| 欧美一区=区三区| 最近2019年中文视频免费在线观看| 成人免费看视频网站| 亚洲激情 国产| 天堂√中文最新版在线| 亚洲欧洲一区二区三区在线观看| 中文av在线全新| 亚洲性xxxx| 四虎国产精品永久在线国在线| 久久久国产视频91| 欧美日韩一本| 成人性生交xxxxx网站| 国内精品久久久久久久97牛牛| 免费不卡亚洲欧美| 国产一区二区中文字幕| 自慰无码一区二区三区| 日本一区二区三区在线观看| 日本aⅴ中文| 欧美体内she精视频| mm视频在线视频| 久久精品亚洲热| 久久不见久久见中文字幕免费| 成人黄色网免费| 久久深夜福利| 国产一区二区网| 亚洲美女免费视频| 国产日韩精品在线看| 日韩精品中文字幕在线不卡尤物| 美女91在线看| 欧美激情第99页| 欧美1级日本1级| 女同性恋一区二区| 国产精品美女久久久久aⅴ| 手机亚洲第一页| 精品调教chinesegay| 欧美韩一区二区| 欧美乱偷一区二区三区在线| 99国产精品99久久久久久| 亚洲一区二区三区成人 | 区一区二日本| 在线看日韩精品电影| 怡红院成人在线| 国产精品6699| 麻豆视频一区二区| 999www人成免费视频| 7777精品伊人久久久大香线蕉的| 精品自拍视频| 成人毛片网站| 97精品国产露脸对白| 视频一区二区在线播放| 亚洲嫩模很污视频| 色135综合网| 青青青免费在线| 欧美剧在线免费观看网站| 91精品在线免费视频| 精品国产一区二区三区麻豆免费观看完整版 | 亚洲精品久久久久中文字幕欢迎你 | 日本欧美视频在线观看| 亚洲天堂精品在线观看| 麻豆tv入口在线看| 久久久这里只有精品视频| 亚洲欧美日韩精品一区二区| 午夜免费精品视频| 欧美成人官网二区| 精品日本12videosex| 免费在线观看视频a| 欧美日本一区二区三区四区| 女同久久另类99精品国产| 性做爰过程免费播放| 在线观看日韩电影| 免费看久久久| 国产欧美精品aaaaaa片| 欧美日韩国产美女| 国产日产一区| 北条麻妃在线视频| 亚洲精品一区二区三区不| 亚洲五月综合| 又黄又爽毛片免费观看| 日韩电影免费观看在线观看| 激情成人亚洲| 成人动漫av| 欧美又大又粗又长| 91看片淫黄大片一级| 欧美freesex黑人又粗又大| 国产激情美女久久久久久吹潮| 亚洲欧美影音先锋| 综合久久av| 久激情内射婷内射蜜桃| 精品一区二区三区电影| 香蕉av777xxx色综合一区| 一级视频在线观看| 国产成人91久久精品| 国产亚洲成年网址在线观看| 欧美sm一区| 国产精品无码乱伦| 精品三级av在线| 久久成人亚洲| 韩国中文字幕在线| 精品无码久久久久久久动漫| 黑人精品xxx一区| 日韩精品看片| 女人被爽到呻吟gif动态图下载| 久久久噜噜噜久久| 久久久www成人免费毛片麻豆| 欧美日韩卡一| 成人免费观看cn| 在线视频亚洲欧美| 成人性视频免费网站| 自拍偷自拍亚洲精品被多人伦好爽| 日本一区免费| 欧美一区二区三区在线看| 99精品免费视频| 综合图区亚洲| 日韩免费av一区二区三区| 日韩一区二区电影在线| 久久三级视频| 在线人成日本视频| 青青草精品视频在线| 中文字幕欧美精品日韩中文字幕| 大桥未久av一区二区三区中文| 色香欲www7777综合网| 国产乱子伦精品无码专区| 日日噜噜噜夜夜爽亚洲精品 | 日本不卡免费一区| 国产香蕉视频在线观看| 91精品久久久久久久久| 欧美性xxxx极品高清hd直播| 午夜片欧美伦| 在线观看a视频| 色综合电影网| 中国日韩欧美久久久久久久久| 高清在线观看日韩| 97久久超碰| 伊人网站在线| 神马影院午夜我不卡影院| 日韩电影中文字幕一区| 久久老女人爱爱| 欧美一站二站| av免费网站在线| 无罩大乳的熟妇正在播放| 国内精品免费午夜毛片| 婷婷六月综合网| 视频一区中文字幕| 不卡精品视频| 天堂在线视频| 亚洲 日韩 国产第一区| 久久久成人av| 无码av免费一区二区三区试看| 国产精品永久| 亚洲国产天堂| 涩爱av在线播放一区二区| 日韩欧美在线观看强乱免费| 久久国产精品久久国产精品| 亚洲动漫第一页| 久久99精品国产麻豆不卡| 国产精品极品| 91麻豆国产福利在线观看宅福利| 亚洲精品无码久久久久久|