天天看點

C#泛型初探

   最近在學習.NET 2.0了(說來慚愧呀,萬多年前就出VS2005了,現在才想起學.NET 2.0),粗略看了下,2.0版本較1.1版本多了不少新的特性,比如MaterPage,Theme,無重新整理Call Server等,頁面生命周期也多了不少方法,可以更精确的控制頁面的呈現過程,令人激動呀。不過今天要說的不是.NET FrameWork 2.0,而是新版C#中的新特性:泛型 

   還是先看看下面一段代碼吧:

C#泛型初探

using  System; 

C#泛型初探

using  System.Collections.Generic; 

C#泛型初探

using  System.Text; 

C#泛型初探
C#泛型初探

namespace  TestConsole2005 

C#泛型初探
C#泛型初探
C#泛型初探

C#泛型初探

    public interface ITest 

C#泛型初探
C#泛型初探
C#泛型初探

C#泛型初探

        void dosth(); 

C#泛型初探

    } 

C#泛型初探

    public class TestClass:ITest 

C#泛型初探
C#泛型初探
C#泛型初探

C#泛型初探

        public TestClass() 

C#泛型初探
C#泛型初探
C#泛型初探

{ } 

C#泛型初探
C#泛型初探
C#泛型初探

        ITest Members#region ITest Members

C#泛型初探

        void ITest.dosth() 

C#泛型初探
C#泛型初探
C#泛型初探

C#泛型初探

            Console.WriteLine("testing1"); 

C#泛型初探

        } 

C#泛型初探

        #endregion 

C#泛型初探

    } 

C#泛型初探

    public class TestClass2 : ITest 

C#泛型初探
C#泛型初探
C#泛型初探

C#泛型初探

        public TestClass2() 

C#泛型初探
C#泛型初探
C#泛型初探

{ } 

C#泛型初探
C#泛型初探
C#泛型初探

        ITest Members#region ITest Members

C#泛型初探

        void ITest.dosth() 

C#泛型初探
C#泛型初探
C#泛型初探

C#泛型初探

            Console.WriteLine("testing2"); 

C#泛型初探

        } 

C#泛型初探

        #endregion 

C#泛型初探

    } 

C#泛型初探

    public class Test<T,T2> where T:ITest,new() where T2:ITest,new() 

C#泛型初探
C#泛型初探
C#泛型初探

C#泛型初探

        private T mt; 

C#泛型初探

        private T2 mt2; 

C#泛型初探

        public Test() 

C#泛型初探
C#泛型初探
C#泛型初探

C#泛型初探

            mt = new T(); 

C#泛型初探

            mt2 = new T2(); 

C#泛型初探

        } 

C#泛型初探

        public void foo() 

C#泛型初探
C#泛型初探
C#泛型初探

C#泛型初探

            mt.dosth(); 

C#泛型初探

            mt2.dosth(); 

C#泛型初探

        } 

C#泛型初探

    } 

C#泛型初探

    class Program 

C#泛型初探
C#泛型初探
C#泛型初探

C#泛型初探

        static void Main(string[] args) 

C#泛型初探
C#泛型初探
C#泛型初探

C#泛型初探

            Test<TestClass, TestClass2> v = new Test<TestClass1, TestClass2>(); 

C#泛型初探

            v.foo(); 

C#泛型初探

            Console.ReadLine(); 

C#泛型初探

        } 

C#泛型初探

    } 

C#泛型初探

}  

   泛型為我們解決了什麼問題呢? 

   在沒有泛型以前,我們在定義變量時都是将它的類型寫死,比如:

C#泛型初探

TestClass mt  =  new  TestClass(); 

C#泛型初探

   這樣在用戶端就沒有辦法改變mt的類型了,除非使用反射,但反射是在運作時指定類型資訊,泛型則不同,泛型是在用戶端編碼時指定類型資訊,比如上面的:

C#泛型初探

Test < TestClass, TestClass2 >  v  =   new  Test < TestClass, TestClass2 > ();

   這一句就是在執行個體化Test類時為T和T2指定詳細的類型資訊。

   把這個與下面的運作結果做個比較(隻是把類型互換了)就知道泛型的工作方式了:

C#泛型初探

Test < TestClass2, TestClass >  v  =   new  Test < TestClass2, TestClass > (); 

   為什麼要使用泛型,其實反射也一樣可以實作這樣的功能。原因在于使用泛型可以保證類型的安全,而反射是到運作時才綁定類型資訊,這樣就很有可能出現類型不比對的情況,而編譯器是無法發現的。 

   最後說明下:

C#泛型初探

P ublic class Test<T,T2> where T:ITest,new() where T2:ITest,new() 

   T和T2聲明了Test類中的兩個泛型類型,他們可以在用戶端執行個體化該類時被顯式指定,where是C#2005才有的用于限制泛型類型的關鍵字,上面的表達式是指泛型T和T2必須指定為實作了ITest接口的類,并且該類可以被執行個體化。 

   泛型還可以代替傳統的簡單工廠模式,總之,泛型的出現是為了支援用戶端指定類型資訊,而反射是運作時指定類型資訊。

轉載于:https://www.cnblogs.com/RainyWolf/archive/2005/11/16/277909.html

c#