C# 泛型概念的初步理解
C# 泛型是一種類型占位符,或稱之為類型參數(shù)。我們知道在一個(gè)方法中,一個(gè)變量的值可以作為參數(shù),但其實(shí)這個(gè)變量的類型本身也可以作為參數(shù)。泛型允許我們在調(diào)用的時(shí)候再指定這個(gè)類型參數(shù)是什么。在.net中,泛型能夠給我們帶來的兩個(gè)明顯好處是——類型安全和減少裝箱、拆箱。通過泛型可以定義類型安全類,而不會(huì)損害類型安全、性能或工作效率。您只須一次性地將服務(wù)器實(shí)現(xiàn)為一般服務(wù)器,同時(shí)可以用任何類型來聲明和使用它。為此,需要使用 ﹤ 和 ﹥ 括號,以便將一般類型參數(shù)括起來。例如,可以按如下方式定義和使用一般堆棧:
- public class Stack
- {
- T[] m_Items;
- public void Push(T item)
- {...}
- public T Pop()
- {...}
- }
- Stack stack = new Stack();
- stack.Push(1);
- stack.Push(2);
- int number = stack.Pop();
C# 泛型代碼塊
顯示一般堆棧的完整實(shí)現(xiàn)。將代碼塊 1 與代碼塊 2 進(jìn)行比較,您會(huì)看到,好像 代碼塊 1 中每個(gè)使用 Object 的地方在代碼塊 2 中都被替換成了 T,除了使用一般類型參數(shù) T 定義 Stack 以外:
- public class Stack
- {...}
在使用一般堆棧時(shí),必須通知編譯器使用哪個(gè)類型來代替一般類型參數(shù) T(無論是在聲明變量時(shí),還是在實(shí)例化變量時(shí)):
- Stack stack = new Stack();
編譯器和運(yùn)行庫負(fù)責(zé)完成其余工作。所有接受或返回 T 的方法(或?qū)傩裕┒紝⒏臑槭褂弥付ǖ念愋停ㄔ谏鲜鍪纠袨檎停?/P>
C# 泛型代碼塊之一般堆棧
- public class Stack
- {
- readonly int m_Size;
- int m_StackPointer = 0;
- T[] m_Items;
- public Stack():this(100)
- {}
- public Stack(int size)
- {
- m_Size = size;
- m_Items = new T[m_Size];
- }
- public void Push(T item)
- {
- if(m_StackPointer ﹥= m_Size)
- throw new StackOverflowException();
- m_Items[m_StackPointer] = item;
- m_StackPointer++;
- }
- public T Pop()
- {
- m_StackPointer--;
- if(m_StackPointer ﹥= 0)
- {
- return m_Items[m_StackPointer];
- }
- else
- {
- m_StackPointer = 0;
- throw new InvalidOperationException(
- "Cannot pop an empty stack");
- }
- }
- }
注 T 是一般類型參數(shù)(或類型參數(shù)),而一般類型為 Stack。Stack 中的 int 為類型實(shí)參。
該編程模型的優(yōu)點(diǎn)在于,內(nèi)部算法和數(shù)據(jù)操作保持不變,而實(shí)際數(shù)據(jù)類型可以基于客戶端使用服務(wù)器代碼的方式進(jìn)行更改。
C# 泛型的基本概念就向你介紹到這里,希望對你了解和學(xué)習(xí)C# 泛型有所幫助。
【編輯推薦】