1. 程式人生 > >C# 泛型入門講解 泛型在系統架構中無處不在

C# 泛型入門講解 泛型在系統架構中無處不在

提到泛型,我們會想起List<T>泛型集合,其中的T就是泛型,任何滿足T的泛型約束的類,皆可使用;

泛型集合是我們平常編碼中最常用的泛型的使用例子之一,那麼泛型是如何出現的,他又是如何被用在實際開發工作中的呢?

先來看看這段程式碼:

public class Test
    {
        public string GetClassType(int i)
        {
            return "此型別為:"+ i.GetType();
        }
        public string GetClassType(string str)
        {
            return "此型別為:" + str.GetType();
        }
        public string GetClassType(bool bl)
        {
            return "此型別為:" + bl.GetType();
        }
    }

呼叫:

 class Program
    {
        static void Main(string[] args)
        {
            Test test = new Test();
            Console.WriteLine(test.GetClassType(1));
            Console.WriteLine(test.GetClassType("1"));
            Console.WriteLine(test.GetClassType(true));
            Console.Read();
        }
    }


是否發現特別彆扭呢,明明Test類中的方法除了引數不同其他完全一樣,但是卻要寫三個方法,作為高階語言,C#是不會讓開發者編寫如此臃腫的程式碼的,高階語言都是愛美的!

在.NET Framework1.0剛出來的時候,就有人想過這個問題了,於是大家想到了用object類,來作為引數,由於面向物件的三大特性,封裝、繼承、多型,利用繼承,任何父類出現的地方都可以用子類來代替,而我們知道Object作為萬類之父,於是乎,此種寫法合情合理的出現:

  public string GetClassType(object obj)
        {
            return "此型別為:" + obj.GetType();
        }


呼叫:test.GetClassType(),分別把int,string,bool型別的引數傳進去,執行結果一致

完美解決問題,當然其中是存在問題的,問題就是:裝箱拆箱,值型別和引用型別,在這之中進行了裝箱拆箱操作,對於這種僅僅是為了程式碼好看而去損耗效能的問題,微軟不會坐視不管的,2.0版本,泛型出世:

 public string GetClassType<T>(T t)
        {
            return "此型別為:" + t.GetType();
        }

執行結果完全一致,其中T就是你所傳過來的引數的型別,T在<T>此處宣告
呼叫時程式碼完全一樣;

泛型的本質:是一個編譯器的語法糖,當你生成編譯時,編譯器在內部自動把泛型方法變成了我們最開始的那種寫法,例如本例中,他自動的拆分成了三個引數不同的方法,當然,這是編譯器自己操作的,我們是看不到的

在系統架構時,泛型無處不在,可以把多個方法整合到一起,本例只是泛型的最簡單的運用,當泛型加上約束,將更加強大,此例中的T,只有objec最原始的幾個方法,如果我們來了一個自定義的類,想獲取其中的屬性方法等,就必須加上約束了,有了約束才更強,泛型成了優秀專案開發過程中,不可缺少的存在!