您好,登錄后才能下訂單哦!
這篇文章主要介紹“C#泛型的應用及優點”,在日常操作中,相信很多人在C#泛型的應用及優點問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C#泛型的應用及優點”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
C# 泛型應用分析
因為 IL 和 CLR 為泛型提供本機支持,所以大多數符合 CLR 的語言都可以利用一般類型。例如,下面這段 Visual Basic .NET 代碼使用代碼塊 2 的一般堆棧:
Dim stack As Stack(Of Integer) stack = new Stack(Of Integer) stack.Push(3) Dim number As Integer number = stack.Pop()
您可以在類和結構中使用泛型。以下是一個有用的一般點結構:
public struct Point { public T X; public T Y; }
可以使用該一般點來表示整數坐標,例如:
Point point; point.X = 1; point.Y = 2;
或者,可以使用它來表示要求浮點精度的圖表坐標:
Point point; point.X = 1.2; point.Y = 3.4;
除了到目前為止介紹的基本泛型語法以外,C# 2.0 還具有一些泛型特定的語法。例如,請考慮代碼塊 2 的 Pop() 方法。假設您不希望在堆棧為空時引發異常,而是希望返回堆棧中存儲的類型的默認值。如果您使用基于 Object 的堆棧,則可以簡單地返回 null,但是您還可以通過值類型來使用一般堆棧。為了解決該問題,您可以使用 default() 運算符,它返回類型的默認值。
下面說明如何在 Pop() 方法的實現中使用默認值:
public T Pop() { m_StackPointer--; if(m_StackPointer >= 0) { return m_Items[m_StackPointer]; } else { m_StackPointer = 0; return default(T); } }
引用類型的默認值為 null,而值類型(例如,整型、枚舉和結構)的默認值為全零(用零填充相應的結構)。因此,如果堆棧是用字符串構建的,則 Pop() 方法在堆棧為空時返回 null;如果堆棧是用整數構建的,則 Pop() 方法在堆棧為空時返回零。
C# 泛型應用之多個一般類型
單個類型可以定義多個一般類型參數。例如,請考慮代碼塊 3 中顯示的一般鏈表。
C# 泛型應用代碼塊之一般鏈表
class Node { public K Key; public T Item; public Node NextNode; public Node() { Key = default(K); Item = defualt(T); NextNode = null; } public Node(K key,T item,Node nextNode) { Key = key; Item = item; NextNode = nextNode; } } public class LinkedList { Node m_Head; public LinkedList() { m_Head = new Node(); } public void AddHead(K key,T item) { Node newNode = new Node(key,item,m_Head.NextNode); m_Head.NextNode = newNode; } }
該鏈表存儲節點:
class Node {...}
每個節點都包含一個鍵(屬于一般類型參數 K)和一個值(屬于一般類型參數 T)。每個節點還具有對該列表中下一個節點的引用。鏈表本身根據一般類型參數 K 和 T 進行定義:
public class LinkedList {...}
這使該列表可以公開像 AddHead() 一樣的一般方法:
public void AddHead(K key,T item);
每當您聲明使用泛型的類型的變量時,都必須指定要使用的類型。但是,指定的類型實參本身可以為一般類型參數。例如,該鏈表具有一個名為 m_Head 的 Node 類型的成員變量,用于引用該列表中的第一個項。m_Head 是使用該列表自己的一般類型參數 K 和 T 聲明的。
Node m_Head;
您需要在實例化節點時提供類型實參;同樣,您可以使用該鏈表自己的一般類型參數:
public void AddHead(K key,T item) { Node newNode = new Node<K,T>(key,item,m_Head.NextNode); m_Head.NextNode = newNode; }
請注意,該列表使用與節點相同的名稱來表示一般類型參數完全是為了提高可讀性;它也可以使用其他名稱,例如:
public class LinkedList {...}
或:
public class LinkedList {...}
在這種情況下,將 m_Head 聲明為:
Node m_Head;
當客戶端使用該鏈表時,該客戶端必須提供類型實參。該客戶端可以選擇整數作為鍵,并且選擇字符串作為數據項:
LinkedList list = new LinkedList(); list.AddHead(123,"AAA");
但是,該客戶端可以選擇其他任何組合(例如,時間戳)來表示鍵:
LinkedList list = new LinkedList(); list.AddHead(DateTime.Now,"AAA");
有時,為特定類型的特殊組合起別名是有用的。可以通過 using 語句完成該操作,如代碼塊 4 中所示。請注意,別名的作用范圍是文件的作用范圍,因此您必須按照與使用 using 命名空間相同的方式,在項目文件中反復起別名。
C# 泛型應用代碼塊之 一般類型別名
using List = LinkedList; class ListClient { static void Main(string[] args) { List list = new List(); list.AddHead(123,"AAA"); } }
到此,關于“C#泛型的應用及優點”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。