1. 程式人生 > >【C#】C# in deep 泛型

【C#】C# in deep 泛型

目的 似的 exc string類型 能夠 出現 pub 檢查 代碼塊

泛型

為什麽要有泛型, 在沒有泛型之前, 什麽東西充當了泛型的作用?

在泛型出現之前, 代碼中會有很多需要強制轉換的地方. 比如 int a = (int) object, 對於這樣類似的代碼, 編譯器在編譯期間無法確定是否是正確的代碼, 只有在真正運行代碼期間才會校驗出來是否正確. 這種強制轉換實際上是讓編譯器去相信你的代碼. 並且你需要撰寫大量的文檔或者註釋去解釋你的代碼.還有的時候你在寫代碼的時候, 會遇到兩個代碼塊極其的相似, 只是參數類型上有所區別. 一個是對int類型進行操作, 一個是對string類型進行操作. 但是你不得不寫兩份, 或者你寫出了一個公共的object去處理. 但是在使用object的功能時候, 又同樣會遇到很多裝箱拆箱, 也可能會遇到各種執行時ClassCastException的異常.

 1 public class Stack
 2     {
 3 
 4         private object[] m_item;
 5 
 6         public object Pop() {...}
 7 
 8         public void Push(object item) {...}
 9 
10         public Stack(int i)
11         {
12 
13             this.m_item = new[i];
14 
15         }
16     }

泛型的出現就是為了解決上述情況. 讓編譯器在編譯期間就能夠發現這種錯誤, 從而在執行期間減少檢查還有很多的裝箱和拆箱的處理, 來達到一個提升程序性能的一個目的.

 1 public class Stack<T>
 2 {
 3     private T[] m_item;
 4 
 5     public T Pop(){...}
 6 
 7     public void Push(T item){...}
 8 
 9     public Stack(int i){
10 
11          this.m_item = new T[i];
12 
13     }
14 }
Stack<int> a = new Stack<int>(100);

   a.Push(10);

   a.Push(
"8888");//這行編譯不通過,因為類a只接收int類型的數據 int x = a.Pop(); Stack<String> b = new Stack<String>(100); b.Push(10);//這行編譯不通過,因為類b只接收String類型的數據 String y = b.Pop();

所以泛型的優勢在於:

1.它是類型安全的。實例化了int類型的棧,就不能處理String類型的數據,其他的數據類型也一樣。

2.無需裝箱和拆箱。這個類在實例化時,按照所傳入的數據類型生成本地代碼,本地代碼數據類型已確定,所以無需裝箱和拆箱。

3.無需類型轉換。

泛型分為 泛型類, 和泛型方法.

泛型中的約束有哪些:

用這些約束可以限制T是哪些.

1. 值約束 T:struct

2. 引用約束 T:Class

3. 構造函數約束 T: new()

4. 轉換類型約束

5. 組合約束

【C#】C# in deep 泛型