物件導向系列菜單11-『泛型(Generics)』
歡哥:師父~今天世足開幕囉!!!
陳夢吉:叫什麼~ 明天就看到我在上面踢了!
什麼是泛型呢
什麼是泛型呢~? 這個東西<T>有看過吧,你有時後會在程式碼裡看到List<T>這種寫法,
這代表List串列中,你可以存放『T』型別,例如List<string>就是裡面存放string,List<int>就是裡面存放int。
<T>也被稱為型別參數。事實上我們可以將範例想成簡單點,那就是一個可以讓你自由決定型別的功能。
為什麼要有泛型呢
假設需要我們建立一個ArrayList,但確發現要取出值都需要轉型,這是因為當你將某個物件存入
ArrayList集合時,它的型別就隱含轉換成object了。只要是命名空間為system.Collection的集合類別都是如何(stack之類的)。
轉型是沒什麼問題,但在處理集合時,常常都會需要使用迴圈來取出或存入集合元素,假設迴歸數很大很大的話,那就會對程式的執行速度產生一定的影響了(不過不嚴重)。
還有一點就是,缺泛編輯時期的安全檢查。
泛型的優點
1.可以用不同的型別去做相同動作的事情
如我上述程式碼的這段
2.可以減少Boxing與UnBoxing,使效能增加。
3.讓程式碼更有彈性、重複使用程式碼。
泛型類別和方法
這邊寫個泛型的小範例,來知道一下大概的寫法。
下列程式碼建立Car類別,其中Class Car<T,T1>被稱為『泛型類別』,而T power 被稱為『泛型參數』。
輸出結果
類別參數的條件約束
既然泛型可以讓我們自由決定型別,但有時候太自由也不太好,那我們要著麼樣來約束呢??
如下,其中『where』就是就是限制的關鍵字,而『T』就是受限制的型別參數,最後Class就是限制的內容。
下列程式碼這為多參數限定
其中限制的內容請參考下圖,來源為MSDN。
我們這邊在來寫個簡單的小程式。
建立個Car類別,並且有二個型別參數T與T1,並限制T型別參數必預是『參數型別』。
然後我們用兩種寫法來測試看看,第一種為T指定為 string型別,第二種為T指定為int型別。
其中,string型別會正確執行,這邊別忘了string為參考型別喔! 而第二種int則會出錯。
注:如果不知道實值與參考是啥的可以參考一下小弟寫的這篇
未繫結的型別參數有幾項注意事項
1.無法使用!= 和 == 運算子,因為不能確定實體的型別引數是否會支援這些運算子。
2.這些參數可與System.Object相互轉換或明確轉換成任何介面型別。
3.你可以與NULL比較。如果將未繫結的型別參數與NULL比較,
那麼當型別引數為實值型別時一定會傳FALSE。
參考資料
http://frankiestudy.blogspot.tw/2012/09/c.html
http://msdn.microsoft.com/zh-tw/library/512aeb7t.aspx
http://msdn.microsoft.com/zh-tw/library/d5x73970.aspx
http://msdn.microsoft.com/zh-tw/library/kx37x362.aspx