1. 程式人生 > >敬畏每一行程式碼,敬畏每一份託付

敬畏每一行程式碼,敬畏每一份託付

    從開發第一個系統,一直在使用泛型。那麼為什麼要使用泛型呢?或者說泛型有什麼好處。

   先來看官方的的解釋:

    泛型類和泛型方法同時具備可重用性、型別安全和效率,這是非泛型類和非泛型方法無法具備的。 泛型通常用與集合以及作用於集合的方法一起使用。 .NET Framework 2.0 版類庫提供一個新的名稱空間 System.Collections.Generic,其中包含幾個新的基於泛型的集合類。 建議面向 .NET Framework 2.0 及更高版本的所有應用程式都使用新的泛型集合類,而不要使用舊的非泛型集合類如 ArrayList。 有關更多資訊,請參見 .NET Framework 類庫中的泛型

   首先第一句話,就清晰的告訴大家了,使用泛型就是這麼好,重用,型別安全,效率。那麼泛型為什麼就有這麼些好處了呢。

可重用性:

現在我們要返回兩個資訊,一種是字串型別的資訊,一種是數值型別的資訊。

不使用泛型的話我們可以這麼做,直接新增兩個方法,一個返回字串,另一個返回數值型別 。

 public string getString(string stringMessage)
        {
            return stringMessage;
        }

        public int getIng(int intMessage)
        {
            return intMessage;
        }
而使用泛型的話:只需要一個方法,很簡單T就是我們泛型
 public T getWord<T>(T t)
        {
            return t;
        }

當然了,有些人說了字串和數值可以相互轉換,一個方法也可以,拜託了,這只是個例子,平常使用的話,泛型多用於IList。而且強制轉換容易出執行時的問題。好的,問題來了,強制轉換,說到強制轉換,可以可以說下List,這就說到接下來的泛型的兩個優點:型別安全和高效率。

    型別安全:

    List裡面可以新增各種資料型別,它可以說是個異類集合。但是它容易資料型別轉換時的執行時錯誤,也就是說型別不安全。

這得說到List的實現方式了。在List中可以放各種各樣的資料型別,不論你push中的元素是什麼東東,統統的變為Object型別。而且值型別向Object轉換時,還得采取裝箱操作,拿出來還得拆箱操作,很容易出現InvalidCastException異常,這有說到了程式設計師的習慣,對於獲取的資料,判null的操作是很必要的。

引用型別向Object的轉換應該不用什麼消耗資源的操作。畢竟所有的物件都繼承Object型別嘛。這一點小編還不太瞭解呢。這點還望大家都多多指點。

但是如果list中的物件不是某個子類物件的例項,那麼強制型別轉換就會出現錯誤,型別安全就會出現問題了。看下面的一段程式碼,某個程式設計師一不小心寫成了Message類的強制轉換。這就出問題了呀

 class Program
    {
        static void Main(string[] args)
        {
           System.Collections.ArrayList list = new System.Collections.ArrayList();
           PersonModel person = new PersonModel();
            person.Age = 23;
            person.Name ="張三";
            list.Add(person);
            PersonModel pserson2 = new PersonModel();
            if(list[0].GetType() == typeof(PersonModel)){
               //某個程式設計師,一不小心寫成了Message類的強制轉換
                Message message = (Message)list[0];
            }

         
            Console.WriteLine(pserson2);

            Console.Read();

        }

    }
    class PersonModel
    {
        string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        int age;

        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        public override string ToString()
        {
            return this.name + "," + this.age;
        }
    }
    class MessageModel
    {
    }

而泛型呢,泛型解決了型別轉換的根本問題,第一它用不著型別的強制轉換。第二泛型集合一旦聲明瞭是何種資料型別的集合,就不再允許其他型別加進去List。最後一旦出現型別轉換的錯誤時,無需執行,編譯就通不過。

看下面的使用泛型強制PersonModel的泛型集合,在編譯時就提示錯誤

            List<PersonModel> personList = new List<PersonModel>();
            personList.Add(person);
            Message message2 =(Message)personList[0]; //提示錯誤,型別轉換通不過

高效率

    最後還有效率的問題。

    很簡單,泛型集合一旦聲明瞭是何種資料型別的集合,就只能新增何種資料型別。新增去也不會轉換成Object,它是執行時動態的獲取型別引數。也就是說沒有裝箱和拆箱這些操作。減少了處理器的資源浪費。

總結:泛型是一種思想,也是一種技術,動態的獲取引數型別,讓程式設計更加的靈活。那麼問題來了,怎麼實現動態的獲取引數型別呢?毫無疑問,使用反射。