溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#泛型類概念舉例分析

發(fā)布時間:2021-12-02 11:20:56 來源:億速云 閱讀:126 作者:iii 欄目:編程語言

這篇文章主要講解了“C#泛型類概念舉例分析”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C#泛型類概念舉例分析”吧!

C# 泛型類封裝不是特定于具體數(shù)據(jù)類型的操作。泛型類最常用于集合,如鏈接列表、哈希表、堆棧、隊列、樹等,其中,像從集合中添加和移除項這樣的操作都以大體上相同的方式執(zhí)行,與所存儲數(shù)據(jù)的類型無關(guān)。對于大多數(shù)需要集合類的方案,推薦的方法是使用 .NET Framework 2.0 類庫中所提供的類。一般情況下,創(chuàng)建泛型類的過程為:從一個現(xiàn)有的具體類開始,逐一將每個類型更改為類型參數(shù),直至達(dá)到通用化和可用性的***平衡。創(chuàng)建您自己的泛型類時,需要特別注意以下事項:

將哪些類型通用化為類型參數(shù)。一般規(guī)則是,能夠參數(shù)化的類型越多,代碼就會變得越靈活,重用性就越好。但是,太多的通用化會使其他開發(fā)人員難以閱讀或理解代碼。如果存在約束,應(yīng)對類型參數(shù)應(yīng)用什么約束。一個有用的規(guī)則是,應(yīng)用盡可能最多的約束,但仍使您能夠處理需要處理的類型。例如,如果您知道您的泛型類僅用于引用類型,則應(yīng)用類約束。這可以防止您的類被意外地用于值類型,并允許您對 T 使用 as 運算符以及檢查空值。 是否將泛型行為分解為基類和子類。由于泛型類可以作為基類使用,此處適用的設(shè)計注意事項與非泛型類相同。

例如,如果您設(shè)計一個類,該類將用于創(chuàng)建基于泛型的集合中的項,則可能需要實現(xiàn)一個接口,如 IComparable<T>,其中 T 是您的類的類型。

類型參數(shù)和約束的規(guī)則對于泛型類行為有幾方面的含義,特別是關(guān)于繼承和成員可訪問性。請務(wù)必先理解一些術(shù)語,然后再繼續(xù)進(jìn)行。對于泛型類 Node<T>,,客戶端代碼可以通過指定類型參數(shù)引用該類,以創(chuàng)建封閉式構(gòu)造類型 (Node<int>),或者可以讓類型參數(shù)處于未指定狀態(tài)(例如在指定泛型基類時)以創(chuàng)建開放式構(gòu)造類型 (Node<T>)。泛型類可以從具體的、封閉式構(gòu)造或開放式構(gòu)造基類繼承:

C# 泛型類代碼

class BaseNode { }  class BaseNodeGeneric<T> { }   // concrete type  class NodeConcrete<T> : BaseNode { }   //closed constructed type  class NodeClosed<T> : BaseNodeGeneric<int> { }   //open constructed type   class NodeOpen<T> : BaseNodeGeneric<T> { }

非泛型(具體)類可以從封閉式構(gòu)造基類繼承,但無法從開放式構(gòu)造類或裸類型參數(shù)繼承,因為在運行時客戶端代碼無法提供實例化基類所需的類型變量。

C# 泛型類代碼

//No error  class Node1 : BaseNodeGeneric<int> { }   //Generates an error  //class Node2 : BaseNodeGeneric<T> {}   //Generates an error  //class Node3 : T {}

從開放式構(gòu)造類型繼承的泛型類必須為任何未被繼承類共享的基類類型參數(shù)提供類型變量,如以下代碼所示:

C# 泛型類代碼

class BaseNodeMultiple<T, U> { }   //No error  class Node4<T> : BaseNodeMultiple<T, int> { }   //No error  class Node5<T, U> : BaseNodeMultiple<T, U> { }   //Generates an error  //class Node6<T> : BaseNodeMultiple<T, U> {}

從開放式構(gòu)造類型繼承的泛型類必須指定約束,這些約束是基類型約束的超集或暗示基類型約束:

C# 泛型類代碼

class NodeItem<T> where T : System.IComparable<T>, new() { }  class SpecialNodeItem<T> :   NodeItem<T> where T : System.IComparable<T>, new() { }

泛型類型可以使用多個類型參數(shù)和約束,如下所示:

C# 泛型類代碼

class SuperKeyType<K, V, U>      where U : System.IComparable<U>      where V : new()  { }

開放式構(gòu)造類型和封閉式構(gòu)造類型可以用作方法參數(shù):

C# 泛型類代碼

void Swap<T>(List<T> list1, List<T> list2)  {      //code to swap items  }   void Swap(List<int> list1, List<int> list2)  {      //code to swap items  }

泛型類是不變的。也就是說,如果輸入?yún)?shù)指定 List<BaseClass>,則當(dāng)您試圖提供 List<DerivedClass> 時,將會發(fā)生編譯時錯誤。

感謝各位的閱讀,以上就是“C#泛型類概念舉例分析”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C#泛型類概念舉例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI