【C#】C# in deep 泛型
阿新 • • 發佈:2018-07-12
目的 似的 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 泛型