成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C# 泛型基礎知識學習大全

開發 后端
C# 泛型基礎知識學習大全向你全面介紹了這一C# 2.0中功能最強大的新特性,包括C# 泛型出現的原因、概念介紹、約束、類型等等,希望對你學習C# 泛型有所幫助。

C# 泛型是C# 2.0中最強大的功能。特點一:通過泛型可以定義類型安全的數據結構,而無需使用具體實際的數據類型,著能夠顯著提高性能并得到高質量的代碼。在概念上,反省類似于C++模板,但是在實現和功能方面存在明顯差異。特點二:泛型通過把類型參數化來達到代碼重用的目標,這一特性可以應用在類、結構、接口、委托、方法的設計之中。泛型除了可以大幅提高代碼復用性外,特點三:還可以提供編譯期間的類型檢查,減少不必要的顯式類型轉換,減少不必要的裝箱操作,從而提高應用程序的運行效率。

1. 引入C# 泛型的原因:

一般情況下,在通用的數據結構中(例如Stack,List,Dictionory等)存儲的數據,要求必須有相同的數據類型。如果必須存儲不同類型的數據,那么唯一的方法就是將所有的數據首先裝箱為object 類型,然后再存儲。
例如,下面的Stack類將其所有的數據存儲在一個object類型的數組中,該類型的兩個方法分別使用object來獲取和返回數據:

  1. public class Stack  
  2. {  
  3. object[] items;  
  4. public void Push(object item) {...}  
  5. public object Pop() {...}  

這樣做的缺點:

第一是性能:根據裝箱和堆棧的功能,使用Push方法能夠想堆棧中壓入任何類型的值,然而,再重新獲取堆棧中的數據值時必須在使用Pop方法拆箱的同時,使用顯式類型轉換得到合適的數據類型。這種裝箱和拆箱的操作增加了執行的負擔,因為它帶來了動態內存分配和運行時類型檢查。

第二是類型安全。因為編譯器允許在任何類型和Object之間進行強制類型轉換,所以將造成編譯時類型安全的不足。主要是Stack類無法強制設置堆棧中的數據類型。

第三是工作效率。編寫類型特定的數據結構以及冗繁的的轉換代碼是一項乏味重復的且易于出錯的工作 。
為了有效解決以上問題,c#2.0引入了泛型。

2.C# 泛型概述

泛型常見于集合應用中,在。net2.0框架的類庫中,提供了一個新的名空間System.Collections.Generic,其中包含了一些新的基于泛型的容器類,例如,System.Collectinos.Generic.Stack,System.Collections.Dictionary,Collections.Generic.List,System.Collections.Generic.Queue
等,這些類庫可以在集合中實現泛型。

以堆棧中實現泛型為例

Stack類示意代碼:

  1.    public class Stack﹤T﹥  
  2.    {  
  3. T[] items;  
  4. int count;  
  5.  public void Push(T item) {...}  
  6.  public T Pop() {...}  

Stack類應用代碼:

  1. //實例化Stack類  
  2. Ststem.Collections.Genric.Stack﹤string﹥ stringStack = new System.Collections.Generic.Stack﹤string﹥;  
  3.    //增加數據  
  4.    stringStack.Push("硬盤");  
  5.    stringStack.Push("聲卡");  
  6.    stringStack.Push("電源");  
  7.    //轉換為數組  
  8.    Araay stringArray;  
  9.    stringArray = stringStack.ToAraay();  
  10.    //顯示數據  
  11.    foreach(string item in stringArray)  
  12. {  
  13.    Console.WriteLine(item);  

3.C# 泛型之約束

為了提供更強大的編譯期間的類型檢查和減少類型轉換,c#允許一個可選的為每個類型參數提供的約束列表。一個類型參數的約束指定了一個類型必須遵守的要求,使得這個類型參數能夠作為一個變量來使用。約束有關鍵字where來聲明,后跟類型參數的名字,再后是一個類或接口 類型的列表,或者構造器約束new().
比如要想使Dictionary﹤K,V﹥類能保證鍵值始終實現IComparable接口,類的聲明中應該對類型參數K指定一個約束

  1. public class Dictionary﹤K,V﹥ where K: IComparable  
  2. {  
  3.  
  4.  public void Add(K key, V value)  
  5.  {  
  6.    ...  
  7.    if(key.CompareTo(x) ﹤ 0 )   {....}  
  8.    ...  
  9.  }  
  10. }  
  11.  

類型參數約束的使用要小心。盡管它們提供了更強大的編譯期間的類型檢查并在一些情況下改進了性能,它還是限制了泛型類型的使用。比如一個泛型類List﹤T﹥可能約束T實現IComparable接口,以便Sort方法能夠比較其中的元素。然而這么做的結果使得List﹤T﹥不能用于那些不能實現IComparable接口的類型,盡管在某些情況下Sort方法從沒有被實際調用過。

4.C# 泛型類型的成員

  1. class C﹤V﹥  
  2. {  
  3. public V f1; //聲明字段  
  4. public D﹤V﹥ f2; //作為其他泛型類型 的參數  
  5. public C﹤V x﹥  
  6. {  
  7.    this.f1 = x;  
  8. }  

泛型類型的成員可以使用泛型類型聲明中的類型參數。但類型參數如果沒有任何約束,則只能在該類型上使用從System.Object繼承的共有成員。

5.C# 泛型接口

  1. interface IList﹤T﹥  
  2. {  
  3. T[] GetElements();  
  4. }  
  5. interface IDictionary﹤K,V﹥  
  6. {  
  7. void Add(K key,V value);  
  8. }  
  9. //泛型接口的類型參數要么已實例化  
  10. //要么來源于實現類聲明的類型參數  
  11.  
  12. class List﹤T﹥:IList﹤T﹥,IDictionary﹤int,T﹥  
  13. {  
  14. public T[] GetElements{}  
  15. {  
  16.    return null;  
  17. }  
  18. public void Add(int index,T value){}  
  19. }  

6.C# 泛型委托

  1. delegate bool Predicate﹤T﹥(T value);  
  2. class X  
  3. {  
  4.  static bool F(int i){...}  
  5.  static bool G(string s){...}  
  6.  static void Main()  
  7.  {  
  8.   Predicate﹤string﹥ p2 = G;  
  9.   Predicate﹤int﹥ p1 = new Predicate﹤int﹥(F);  
  10.  }  

泛型委托支持返回值和參數哂納感應用參數類型,這些參數類型同樣可以附帶合法的約束。

7.C# 泛型方法的簡介

C#泛型機制只支持“在方法聲明上包含類型參數” -- 即泛型方法。

C#泛型機制不支持在除方法外的其他成員(包括屬性、事件、索引器、構造器、析構器)的聲明上包含類型參數,但這些成員本身可以包含在泛型類型中,并使用泛型類型的類型參數。

泛型方法既可以包含在泛型類型中,也可以包含在非泛型類型中。

8.C# 泛型方法的聲明與調用

  1. public class Finder  
  2. {  
  3. // 泛型方法的聲明  
  4. public static int Find﹤T﹥(T[] items,T item)  
  5. {  
  6. for(int i=0;i﹤items.Length;i++)  
  7. {  
  8.  if(items[i].Equals(item)  
  9. {  
  10. return i;  
  11. }  
  12. }  
  13. return -1;  
  14. }  
  15. }  
  16.  
  17. // 泛型方法的調用  
  18. int i = Finder.Find﹤T﹥(new int[]{1,3,4,5,6,8,9},6);  

泛型編程

9.C# 泛型方法的重載

  1. class MyClass  
  2. {  
  3. void F1﹤T﹥(T[] a,int i); // 不可以構成重載方法  
  4. void F1﹤U﹥(U[] a,int i);  
  5.  
  6. void F2﹤T﹥(int x); // 可以構成重載方法  
  7. void F2(int x);  
  8.  
  9. void F3﹤T﹥(T t) where T : A; // 不可以構成重載方法  
  10. void F3﹤T﹥(T t) where T : B;  
  11. }  

10.C# 泛型方法的重寫

  1. abstract class Base  
  2. {  
  3. public abstract T F﹤T,U﹥(T t,U u) where U : T;  
  4. public abstract T G﹤T﹥(T t) where U : IComparable;  
  5. }  
  6. class Derived:Base  
  7. {  
  8. // 合法的重寫,約束被默認繼承  
  9. public override X F(X,Y)(X x,Y y){}  
  10.  
  11. // 非法的重寫,指定任何約束都是多余的  
  12. public override T G﹤T﹥(T t) where T : Comparable{}  
  13. }  

11.C# 泛型約束簡介

C#泛型要求對"所有泛型類型或泛型方法的類型參數"的任何假定,都要基于"顯式的約束",以維護C#所要求的類型安全.

"顯式約束"有where字句表達,可以指定"基類約束","接口約束","構造器約束","值類型/引用類型約束"共四中約束.

"顯示約束"并非必須,如果沒有指定"顯式約束",泛型類型參數將只能訪問System.Object類型中的公有方法.

基類約束

  1. class A  
  2. {  
  3. public void F1(){}  
  4. }  
  5. class B  
  6. {  
  7. public void F2(){}  
  8. }  
  9.  
  10. class C(S,T)  
  11. where S:A // S繼承自A  
  12. where T:B // T繼承自B  
  13. {  
  14. // 可以在類型為S的變量上調用F1  
  15. // 可以在類型為T的變量上調用F2  
  16. }  

接口約束

  1. interface IPrintable{coid Print();}  
  2. interface IComparable﹤T﹥{int CompareTo(T v);}  
  3. interface IKeyProvider﹤T﹥{T HetKey();}  
  4.  
  5. class Dictionary﹤K,V﹥  
  6.    where K:IComparable﹤K﹥  
  7.    where V:IPrintable,IKeyProvider﹤K﹥  
  8. {  
  9. // 可以在類型為K的變量上調用CompareTo  
  10. // 可以在類型為V的變量上調用Print和GetKey  
  11. }  

構造器約束

  1. class A  
  2. {  
  3. public A(){}  
  4. }  
  5. class B  
  6. {  
  7. public B(int i)()  
  8. }  
  9.  
  10. class C﹤T﹥  
  11.    where T:new()  
  12. {  
  13. // 可以在其中使用T t = new T();  
  14. }  
  15. C﹤A﹥ c = new C﹤A﹥(); // 可以,A有無參數構造器  
  16. C﹤B﹥ c = new C﹤B﹥(); // 錯誤,B沒有無參數構造器  

值類型/引用類型約束

  1. public struct A{...}  
  2. public class B{...}  
  3.  
  4. class C﹤T﹥  
  5. where T : struct 
  6. {  
  7. // T在這里面是一個值類型  
  8. }  
  9. C﹤A﹥ c = new C﹤A﹥(); // 可以,A是一個值類型  
  10. C﹤B﹥ c = new C﹤B﹥(); // 錯誤,B是一個引用類型 

12.C# 泛型總結

C# 泛型能力有CLR在運行時支持,它既不同于c++在編譯時所支持的靜態模板,也不同于java在編譯器層面使用"檫拭法"支持的簡單的類型.

C# 泛型支持包括類,結構,接口,委托共四種泛型類型,以及方法成員.

C# 泛型采用"基類,接口,構造器,值類型/引用類型"的約束方式來實現對類型參數的"顯式約束",它不支持C++模板那樣的基于簽名的顯式約束.

C# 泛型的基本知識就介紹到這里了,希望對你了解和學習C# 泛型有所幫助。

【編輯推薦】

  1. C# 泛型委托學習經驗淺析
  2. 淺析運行庫中的C# 泛型
  3. C# 泛型方法中反射常用方法淺析
  4. C# 泛型應用中屬性淺析
  5. C#泛型操作數據庫切換實踐
責任編輯:仲衡 來源: 百度空間
相關推薦

2009-08-27 16:37:06

C#基礎知識

2009-08-13 12:50:45

C#基礎知識

2009-08-13 16:13:03

C#基礎知識

2010-07-23 13:16:07

Perl

2009-08-24 15:38:21

C# 泛型數組

2009-08-11 15:17:12

C#基礎知識

2009-08-13 15:40:28

C#基礎知識

2009-08-24 18:22:05

C# 泛型編程

2010-07-16 11:22:31

Perl

2009-08-24 15:50:23

C# 泛型C# 泛型委托

2009-08-03 13:55:03

C#基礎知識

2009-08-21 17:19:36

C#網絡編程入門

2009-08-19 17:13:15

C# 操作符基礎知識

2009-08-26 09:36:03

C#泛型

2023-12-25 09:35:28

C#泛型.Net編程語言

2009-09-02 17:38:16

C#泛型支持

2009-08-24 15:12:13

C# 泛型接口

2009-08-24 18:15:24

C# Dictiona

2009-06-24 10:25:25

C#泛型

2009-08-24 14:51:25

C# 泛型泛型類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲日本欧美日韩高观看 | 精品久久久久久18免费网站 | 精品国产网 | 亚洲精品一区二区网址 | 亚洲一区 | 欧美国产中文 | 日本不卡一区 | 国产高清精品一区二区三区 | 亚洲国产欧美在线人成 | 欧美一级在线 | 国产亚洲第一页 | 成人免费视频观看视频 | 欧美久久一区二区三区 | 蜜臀网| 91麻豆精品国产91久久久久久 | 久久99久久 | 一级毛片在线播放 | 亚洲精品大片 | 久久久女女女女999久久 | 成人综合一区二区 | 日韩在线观看一区 | 日韩不卡视频在线观看 | 春色av| 欧美日韩国产免费 | 欧美日韩黄色一级片 | 欧美精品一二三区 | 精品久久中文 | 国产精品亚洲视频 | 国产91丝袜在线播放 | 免费网站国产 | 精品啪啪 | 日韩欧美手机在线 | 特级特黄特色的免费大片 | 亚洲精品一区中文字幕乱码 | 久久激情视频 | 精品久久久久久一区二区 | 久久久久久久久久久久91 | 国产精品一区一区 | 日韩成人在线观看 | 99精品免费久久久久久久久日本 | 三级黄视频在线观看 |