2018年6月24日 星期日

【C#】Generics

從之前寫的文章拆出來

Generics#2 (再談泛型)
泛型的功能是傳入 Class T 為類別或方法的參數;這提供我們一個彈性,就是在執行時期才決定某些東西的型別,就以前面的 List 為例,我們來看微軟的 src code
namespace System.Collections.Generic {
 
    using System;
    ...
    
    public class List<T> : IList<T>, ...
    {
        ...
        private T[] _items;
        ...

不重要的地方我截掉了,可以看到它是用普通陣列為底去實作的,對於 List 的操作(比方 Sort();)來說陣列元素是什麼型別完全沒有影響,但如果我們沒有 T,要定義 List 中的普通陣列要嘛就是 object[] _items 操作完出去在轉型,不然就是建構子就要傳具型別的陣列進來,像 List(SomeType[] array)。

但對前者,問題是效能差(因為要轉型),而且多了不必要的轉型錯誤可能性,後者則是泛用性低落,每多一個型別就被迫要寫一個多載,造成大量的程式碼重覆。所以在需要把型別當參數的這個背景需求下發展了泛型這個功能。

沒有留言:

張貼留言