物件導向系列菜單 11-『 泛型 ( Generics ) 』
c井字號 物件導向
Lastmod: 2019-12-11

什麼是泛型呢

什麼是泛型呢~? 這個東西有看過吧,你有時後會在程式碼裡看到List這種寫法, 這代表List串列中,你可以存放『T』型別,例如List就是裡面存放string,List就是裡面存放int。也被稱為型別參數。事實上我們可以將範例想成簡單點,那就是一個可以讓你自由決定型別的功能。

為什麼要有泛型呢

假設需要我們建立一個ArrayList,但確發現要取出值都需要轉型,這是因為當你將某個物件存入ArrayList集合時,它的型別就隱含轉換成object了。只要是命名空system.Collection的集合類別都是如何(stack之類的)

ScreenClip.png

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

ScreenClip.png

泛型的優點

  • 可以用不同的型別去做相同動作的事情如我上述程式碼的這段。 ScreenClip.png

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

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

泛型類別和方法

這邊寫個泛型的小範例,來知道一下大概的寫法。下列程式碼建立Car類別,其中Class Car<T,T1>被稱為『泛型類別』,而T power 被稱為『泛型參數』。

ScreenClip.png

ScreenClip.png

輸出結果

ScreenClip.png

類別參數的條件約束

既然泛型可以讓我們自由決定型別,但有時候太自由也不太好,那我們要著麼樣來約束呢?如下,其中『where』就是就是限制的關鍵字,而『T』就是受限制的型別參數,最後Class就是限制的內容。

ScreenClip.png

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

ScreenClip.png

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

ScreenClip.png

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

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

ScreenClip.png

然後我們用兩種寫法來測試看看,第一種為T指定為 string型別,第二種為T指定為int型別。 其中,string型別會正確執行,這邊別忘了string為參考型別喔! 而第二種int則會出錯。

ScreenClip.png

: 如果不知道實值與參考是啥的可以參考一下小弟寫的這篇實值型別與參考型別的記憶體配置

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

  • 無法使用!= 和 == 運算子,因為不能確定實體的型別引數是否會支援這些運算子。
  • 這些參數可與System.Object相互轉換或明確轉換成任何介面型別。
  • 你可以與NULL比較。如果將未繫結的型別參數與NULL比較,那麼當型別引數為實值型別時一定會傳FALSE。

參考資料

comments powered by Disqus