<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 泛型類(C# 編程指南) 泛型類封裝不是特定于具體數據類型的操作。泛型類最常用于集合,如鏈接列表、哈希表、堆棧、隊列、樹等。像從集合中添加和移除項這樣的操作都以大體上相同的方式執行,與所存儲數據的類型無關。 對于大多數需要集合類的方案,推薦的方法是使用 .NET Framework 類庫中所提供的類。有關使用這些類的更多信息,請參見[.NET Framework 類庫中的泛型(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/ac30fak4.aspx)。 一般情況下,創建泛型類的過程為:從一個現有的具體類開始,逐一將每個類型更改為類型參數,直至達到通用化和可用性的最佳平衡。創建您自己的泛型類時,需要特別注意以下事項: * 將哪些類型通用化為類型參數。 通常,能夠參數化的類型越多,代碼就會變得越靈活,重用性就越好。但是,太多的通用化會使其他開發人員難以閱讀或理解代碼。 * 如果存在約束,應對類型參數應用什么約束(請參見 [類型參數的約束(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/d5x73970.aspx))。 一條有用的規則是,應用盡可能最多的約束,但仍使您能夠處理必須處理的類型。例如,如果您知道您的泛型類僅用于引用類型,則應用類約束。這可以防止您的類被意外地用于值類型,并允許您對 T 使用 **as** 運算符以及檢查空值。 * 是否將泛型行為分解為基類和子類。 由于泛型類可以作為基類使用,此處適用的設計注意事項與非泛型類相同。請參見本主題后面有關從泛型基類繼承的規則。 * 是否實現一個或多個泛型接口。 例如,如果您設計一個類,該類將用于創建基于泛型的集合中的項,則可能必須實現一個接口,如 [IComparable&lt;T&gt;](https://msdn.microsoft.com/zh-cn/library/4d7sx9hd.aspx),其中 T 是您的類的類型。 有關簡單泛型類的示例,請參見[泛型介紹(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/0x6a29h6.aspx)。 類型參數和約束的規則對于泛型類行為有幾方面的含義,特別是關于繼承和成員可訪問性。您應當先理解一些術語,然后再繼續進行。對于泛型類 Node&lt;T&gt;,客戶端代碼可通過指定類型參數來引用該類,以便創建封閉式構造類型 (Node&lt;int&gt;)。或者可以讓類型參數處于未指定狀態(例如在指定泛型基類時)以創建開放式構造類型 (Node&lt;T&gt;)。泛型類可以從具體的、封閉式構造或開放式構造基類繼承: ``` 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> { } ``` 非泛型類(換句話說,即具體類)可以從封閉式構造基類繼承,但無法從開放式構造類或類型參數繼承,因為在運行時客戶端代碼無法提供實例化基類所需的類型參數。 ``` //No error class Node1 : BaseNodeGeneric<int> { } //Generates an error //class Node2 : BaseNodeGeneric<T> {} //Generates an error //class Node3 : T {} ``` 從開放式構造類型繼承的泛型類必須為任何未被繼承類共享的基類類型參數提供類型變量,如以下代碼所示: ``` 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> {} ``` 從開放式構造類型繼承的泛型類必須指定約束,這些約束是基類型約束的超集或暗示基類型約束: ``` class NodeItem<T> where T : System.IComparable<T>, new() { } class SpecialNodeItem<T> : NodeItem<T> where T : System.IComparable<T>, new() { } ``` 泛型類型可以使用多個類型參數和約束,如下所示: ``` class SuperKeyType<K, V, U> where U : System.IComparable<U> where V : new() { } ``` 開放式構造類型和封閉式構造類型可以用作方法參數: ``` 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 } ``` 如果某個泛型類實現了接口,則可以將該類的所有實例強制轉換為該接口。 泛型類是不變的。也就是說,如果輸入參數指定 List&lt;BaseClass&gt;,則當您嘗試提供 List&lt;DerivedClass&gt; 時,將會發生編譯時錯誤。 ## 請參閱 [System.Collections.Generic](https://msdn.microsoft.com/zh-cn/library/system.collections.generic.aspx) [C# 編程指南](https://msdn.microsoft.com/zh-cn/library/67ef8sbd.aspx) [泛型(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/512aeb7t.aspx) [Saving the State of Enumerators(保存枚舉器的狀態)](http://go.microsoft.com/fwlink/?LinkId=112390) [An Inheritance Puzzle, Part One(一個繼承難題,第一部分)](http://go.microsoft.com/fwlink/?LinkId=112380)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看