物件導向系列菜單11-『泛型(Generics)』

物件導向系列菜單11-『泛型(Generics)』

 

歡哥:師父~今天世足開幕囉!!!

陳夢吉:叫什麼~ 明天就看到我在上面踢了! 

 


 

什麼是泛型呢

什麼是泛型呢~? 這個東西<T>有看過吧,你有時後會在程式碼裡看到List<T>這種寫法,

這代表List串列中,你可以存放『T』型別,例如List<string>就是裡面存放string,List<int>就是裡面存放int。

<T>也被稱為型別參數。事實上我們可以將範例想成簡單點,那就是一個可以讓你自由決定型別的功能。

 

 

為什麼要有泛型呢

假設需要我們建立一個ArrayList,但確發現要取出值都需要轉型,這是因為當你將某個物件存入

ArrayList集合時,它的型別就隱含轉換成object了。只要是命名空間為system.Collection的集合類別都是如何(stack之類的)。

ScreenClip

 

轉型是沒什麼問題,但在處理集合時,常常都會需要使用迴圈來取出或存入集合元素,假設迴歸數很大很大的話,那就會對程式的執行速度產生一定的影響了(不過不嚴重)。

還有一點就是,缺泛編輯時期的安全檢查。

ScreenClip1

 

泛型的優點

1.可以用不同的型別去做相同動作的事情

如我上述程式碼的這段

ScreenClip2

2.可以減少Boxing與UnBoxing,使效能增加。

3.讓程式碼更有彈性、重複使用程式碼。

 

泛型類別和方法

這邊寫個泛型的小範例,來知道一下大概的寫法。

下列程式碼建立Car類別,其中Class Car<T,T1>被稱為『泛型類別』,而T power 被稱為『泛型參數』。

ScreenClip4

ScreenClip5

輸出結果

ScreenClip6

 

類別參數的條件約束

既然泛型可以讓我們自由決定型別,但有時候太自由也不太好,那我們要著麼樣來約束呢??

如下,其中『where』就是就是限制的關鍵字,而『T』就是受限制的型別參數,最後Class就是限制的內容。

ScreenClip7

 

下列程式碼這為多參數限定

ScreenClip8

 

其中限制的內容請參考下圖,來源為MSDN。

ScreenClip9

 

我們這邊在來寫個簡單的小程式。

建立個Car類別,並且有二個型別參數T與T1,並限制T型別參數必預是『參數型別』。

ScreenClip10

 

然後我們用兩種寫法來測試看看,第一種為T指定為 string型別,第二種為T指定為int型別。

其中,string型別會正確執行,這邊別忘了string為參考型別喔! 而第二種int則會出錯。

ScreenClip11

注:如果不知道實值與參考是啥的可以參考一下小弟寫的這篇

實值型別與參考型別的記憶體配置

 

未繫結的型別參數有幾項注意事項

1.無法使用!= 和 == 運算子,因為不能確定實體的型別引數是否會支援這些運算子。

ScreenClip12

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

 

 



小弟才書學淺~請各位客官指教指教~~~

小弟日 : 你要知道自已不是帥哥,你才有可能變成帥哥 。