5/14/2010

[ C# ] 泛型場合

本文轉載自 : http://dotnetframework.blogspot.com/2006/08/c.html

自C++以來, Generic(泛型) 始終是我很喜歡的一種機制, 在.NET 2.0終於納入後, 當然也把它實作在我們的系統中
. 以自己的使用心得來說, 我覺得, 這個世界因為有Generic而變得更美好
~ ha ha.




或許一般最常提出的問題就是:為什麼要用Generic? 是的, 沒有Generic也活的好好的, 看不出差別在什麼地方.

當我們廣泛的去使用物件繼承關係, 當我們習慣不去考慮彈性問題, 通常會變成大量物件去繼承某一個基底型別時, 而同時不自覺得習慣用該基底型別當作參數傳遞, 函式傳回的型別. 因此我們的程式碼中, 就會出現大量的轉型動作, Boxing動作.

而Generic出現的場合正是:

1. 針對某一系列的型別進行處理, 特別當是用集合型別來處理時.

若系統中有許多ArrayList, 那就該考慮改用List<>之類的泛型集合.

2. 若系統必須將一堆ValueType變數以集合型別暫存(像 array, ArrayList), 也可以用泛型來取代, 用以避免Boxing的出現.

3. 程式中的集合型別只能處理特別型別時採用

例如:某一函式所傳入的參數, 只能是繼承BusinessEntity基底類別時, 我們可以這樣寫..



4. 最佳化程式碼的重複使用.

就像System.Collections.Generic.List<>來說, 在經過最佳化之後的集合類別, 可以提供給任何型別來使用, 不必再自行定義多組特別型別的集合.

5. 不只是集合.

雖然上例提到的多是集合的用法(這也是Generic最好發揮之處), 但無論是interface, method, parameter, delegate..., 只要有需要, Generic都能幫助我們做好該做的事.



若再進一步, 讓Generic與Reflection結合在一起, 所產生的威力更是強大. 例如將它們套用在Factory Pattern中, 或是應用在ORM中, 用以產生persistence object.

無論如何, 在有Generic的世界, 不去善用它, 就像是自廢武功一樣. 當然, 我們的前提是使用泛型時必須經過良好的物件導向設計, 分析出需要Generic的場合, 而必須避免over design, 將一切都給泛型化.