淺析C# 泛型約束中的構造函數約束
C# 泛型約束中的構造函數約束使用 C# 泛型,編譯器會將一般代碼編譯為 IL,而不管客戶端將使用什么樣的類型實參。因此,一般代碼可以嘗試使用與客戶端使用的特定類型實參不兼容的一般類型參數的方法、屬性或成員。這是不可接受的,因為它相當于缺少類型安全。在 C# 中,您需要通知編譯器客戶端指定的類型必須遵守哪些約束,以便使它們能夠取代一般類型參數而得到使用。存在三個類型的約束。構造函數約束指示編譯器一般類型參數派生自諸如接口或特定基類之類的基類型。
默認構造函數約束指示編譯器一般類型參數公開了默認的公共構造函數(不帶任何參數的公共構造函數)。引用/值類型約束將一般類型參數約束為引用類型或值類型。一般類型可以利用多個約束,您甚至可以在使用一般類型參數時使 IntelliSense 反射這些約束,例如,建議基類型中的方法或成員。
C# 泛型約束中的構造函數約束的理解:
假設您要在一般類的內部實例化一個新的一般對象。問題在于,C# 編譯器不知道客戶端將使用的類型實參是否具有匹配的構造函數,因而它將拒絕編譯實例化行。
為了解決該問題,C# 允許約束一般類型參數,以使其必須支持公共默認構造函數。這是使用 new() 約束完成的。例如,以下是一種實現代碼塊 3 中的一般 Node 的默認構造函數的不同方式。
C# 泛型約束中的構造函數約束的實例:
- class Node where T : new()
- {
- public K Key;
- public T Item;
- public Node NextNode;
- public Node()
- {
- Key = default(K);
- Item = new T();
- NextNode = null;
- }
- }
可以將構造函數約束與構造函數約束組合起來,前提是構造函數約束出現在約束列表中的最后:
- public class LinkedList where K : IComparable,new()
- {...}
C# 泛型約束中的構造函數約束相關的內容就向你介紹到這里,希望對你了解和學習C# 泛型約束中的構造函數約束有所幫助。
【編輯推薦】