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

















