C#泛型基礎

來源:互聯網
上載者:User

         C#語言推出泛型已經有好多年了。泛型的推出可以說是一項創舉,可是實際上我們經常是怎樣使用泛型的呢。?。

  之前也常用一些泛型的基本用法,文法也看過一段時間。但是畢竟還是有很多”進階“一些的用法沒怎麼用過。最近做一個基於微軟MCS架構的項目時,很多都給封裝好了,包括常用的TextBox也被微軟那幫人給重寫了。由於大量的重寫,所以難免會有大量的泛型等等大量的運用。看到被封裝好的源碼,也難免不去梳理一下相關知識。這一節主要包括一下幾個部分:

  1、泛型約束

       2、new關鍵字.

       3、default關鍵字的用法

 

      以上是c#泛型最基本的幾個知識點.下面將說說這些概念的理解以、關鍵字。

     1、泛型約束.

     何謂泛型約束呢。?泛型約束是我們在定義泛型類時,在實際泛型類的使用過程中,對泛型類類型的一些約束。

     泛型約束是通過泛型類定義來體現的。請看下面代碼中泛型約束的定義:

 

public  class BaseClass    {        public  BaseClass()        {            Console.WriteLine("Abstractor  constructor method");        }        public void Method()        {            Console.WriteLine(" method in Base Class");        }    }   public class TestSubClass : BaseClass   {       //public override void Method()       //{       //    Console.WriteLine("testSubClass method");       //}   }   public class Cat   {       public void CatEat()       {           Console.WriteLine("CatEat method");       }   }   public class SubClass<T> where T:BaseClass    {        public T instance;        public void subMethod()        {            Console.WriteLine("subClass");            }    }

  其中 SubClass<T>就是一個自訂類,T為泛型型別,where T:BaseClass就是定義的泛型類的約束。意思就是說在使用SubClass<T>時候,我們必須用BaseClass或者BaseClass的子類來對SubClass<T>進行執行個體化。

使用如下:

 

SubClass<BaseClass> cast = new SubClass<BaseClass>();            cast.subMethod();            SubClass<TestSubClass> cast2 = new SubClass<TestSubClass>();            cast2.subMethod();            Console.WriteLine("aa");            Console.ReadLine();

  輸出如下:

    2、new關鍵字。

         new關鍵字的作用是值對泛型型別的預設建構函式。類型定義如下:

   public abstract class BaseClass    {        public  BaseClass()        {            Console.WriteLine("Abstractor  constructor method");        }        public virtual void Method()        {            Console.WriteLine("Method in Abastact class");        }    }  public class TestSubClass : BaseClass   {       public TestSubClass()       {                  }   }public class SubClass<T> where T:BaseClass,new ()    {        public T instance;        public void subMethod()        {            Console.WriteLine("subClass");            if (instance == null)            {                instance = new T();                instance.Method();                Console.WriteLine(instance.GetType().ToString());            }        }    }

     對比泛型約束,對BaseClass的改動僅限為將其改為抽象類別、並在自訂類型 SubClass<T>中在where中使用了new ()

.new () 的意思是說泛型型別T必須要有一個無參數建構函式。

輸出如下:

 此時,需要注意的是在用TestSubClass替換泛型型別T執行個體化 SubClass<T>時候,可以在TestSubClass中不定義任何建構函式,但是若我們要定義帶參數的建構函式時,一定同時要有不帶參數建構函式。因為我們不定義建構函式時,.Net FrameWork會預設有一個無參數建構函式,但是如果我們定義了一個帶參數的,則它只有這個建構函式了,這是C#文法開遍就介紹過了。

  另外:在使用new進行約束時,不能帶有帶參數的建構函式。

     3、default關鍵字的使用。

  首先給出MSDN給出的介紹:

在泛型類和泛型方法中產生的一個問題是,在預先未知以下情況時,如何將預設值分配給參數化型別 T:

  • T 是參考型別還是實值型別。

  • 如果 T 為實值型別,則它是數值還是結構。

  給定參數化型別 T 的一個變數 t,只有當 T 為參考型別時,語句 t = null 才有效;只有當 T 為數實值型別而不是結構時,語句 t = 0 才能正常使用。解決方案是使用 default 關鍵字,此關鍵字對於參考型別會返回空,對於數實值型別會返回零。對於結構,此關鍵字將返回初始化為零或空的每個結構成員,具體取決於這些結構是實值型別還是參考型別。以下來自 GenericList<T> 類的樣本顯示了如何使用 default 關鍵字。

  首先看看它的用法:

 public class TestGeneric<T>    {        public T GetValue()        {            T instance = default(T);            if (instance == null)            {                Console.WriteLine(" instance is null");            }            else            {                Console.WriteLine("value of instance is {0}",instance);            }            return instance;        }    }}TestGeneric<string> instance = new TestGeneric<string>();            instance.GetValue();            Console.ReadLine();

輸出如下:

 如果將泛型型別string換位int,則輸出如下:

  那麼如果我們用struct類型替換泛型型別會是什麼情況呢。?

  可以定義一個struct試試:

      代碼如下:

  public struct Point    {        public int X { get; set; }        public int Y { get; set; }    }TestGeneric<Point> instance = new TestGeneric<Point>();            instance.GetValue();            Console.ReadLine();

輸出如下:

 struct是一種實值型別的,所以它不會像string等參考型別使用default的時候會為null。

 好了,就到這裡,希望對初學泛型的朋友有一些協助!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.