對.NET2.0泛型初步理解

iDotNetSpace發表於2009-01-13

知道泛型很久了,但是一直沒有好好的去研究過,最近看到很多系統的原始碼中都含有泛型的程式設計,所以心血來潮就查閱了MSDN之後code了一些程式碼來理解

泛型,的確在自己寫程式碼的過程中,能發現很多問題,這些看書都是體會不到的。

Code
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

//泛型測試2009.1.6
namespace ConsoleApplication1
{
    class Test
    {
        static void Main(string[] args)
        {
            ArrayList Array = new ArrayList();
            Array.Add(2);
            Array.Add(8);
            Array.Add("HELLO,I AM A TYPE OF STRING!");
            foreach (int p in Array)
            {
                Console.WriteLine(p);
            }
            //這裡進行onboxing取消裝箱,foreach (int p in Array),其中int p的型別int是foreach執行拆箱的強制型別,
            //因此如果這裡是建立一個創異類集合,必定會錯誤,因為"HELLO,WORLD"無法轉換為int

            Console.WriteLine(Int32.Parse(Array[0].ToString()));
            Console.WriteLine(Int32.Parse(Array[1].ToString()));
            //string aa = Array[2];//為了證明加入集合的字串已經不再是字串,這裡是裝箱過的型別object,所以編譯錯誤,無法將object隱式轉換成string,
            Console.WriteLine(Array[2]);//WriteLine接受引數本身就是object,這裡正常輸出,如果輸出字串

            
        }
    }
}


 class Test2
    {
        static void Main(string[] args)
        {
            List List3 = new List();
            List3.Add(0);
            List3.Add(1);
            List3.Add(2);
            List3.Add("i am not here?");//編譯器不能通過。
            int the1 = List3[0];//呵呵,和上面相同的測試方式,這裡說明加入的集合資料沒有進行裝箱操作,集合元素本身的確是一個int型別
            foreach (int p in List3)
             {
                 Console.WriteLine(p);
             }
        }
 
    }

  class Test3
    {
        static void Main(string[] args)
        {
            string[] parm1 = { "I AM STRING1", "I AM STRING2", "I AM STRING3" };
            Test3.Insert(parm1);
        }

       public static void Insert(T[] parms)
        {
            List ListT = new List();
            if (parms.Length > 0)
            {
                for (int i=0; i< parms.Length; i++)
                {
                    ListT.Add(parms[i]);
                }
            }
            foreach (T p in ListT)
            {
                Console.WriteLine(p);
            }
                 


        }
    }
 

 

 

Test1為什麼要泛型?
在foreach檢索時進行取消裝箱操作。強制轉換以及裝箱和取消裝箱操作都會降低效能,而且對於建立異類集合的時候。
即向集合加入不同型別資料的時候,如上, foreach (int p in Array)就不能迭代所有內容,遇見字串型別錯誤,而且C#編譯器在編譯的時不出錯,在執行時才顯示此錯誤,

Test2程式碼使用了泛型?
程式碼說明了加入集合的過程沒有在進行裝箱向上轉換為object的操作了,而且編譯器能夠通過安全檢查,只要是輸入非整形的就會報錯的,
這裡編譯器會同時候報兩次錯誤,
錯誤 1 與“System.Collections.Generic.List.Add(int)”最匹配的過載方法具有一些無效引數 C:\Documents and Settings\Administrator\桌面

\ConsoleApplication1\ConsoleApplication1\Program.cs 41 13 ConsoleApplication1
錯誤 2 引數“1”: 無法從“string”轉換為“int” C:\Documents and Settings\Administrator\桌面\ConsoleApplication1\ConsoleApplication1

\Program.cs 41 23 ConsoleApplication1;

Test3如何用泛型?
第三個示例是簡單的泛型應用,插入幾個方法Insert,根據需要指定一個型別引數,就可以,編譯器會自動檢查型別是否和你提供的型別一致。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-536625/,如需轉載,請註明出處,否則將追究法律責任。

相關文章