<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C#泛型基礎

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

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

        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。

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

      posted @ 2011-01-22 00:23  tyb1222  閱讀(1073)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日韩精品二区三区四区| 亚洲人成网站18禁止无码| 四虎女优在线视频免费看| 亚洲中文字幕在线精品一区| 啊灬啊灬啊灬快灬高潮了电影片段| 暖暖 免费 高清 日本 在线观看5| 大肉大捧一进一出好爽视频mba| 亚洲成人av在线资源网| 久久精品国产亚洲av电影| AV人摸人人人澡人人超碰| 色噜噜狠狠成人综合| 夜色福利站WWW国产在线视频 | 国产熟女激情一区二区三区| 日本老熟女一二三区视频| 国产精品无码av天天爽播放器 | 国产午夜福利视频在线| 无码人妻丝袜在线视频红杏| 国产精品日韩av在线播放| 国产一区二区三区禁18| 麻豆精品一区二正一三区| 婷婷久久香蕉五月综合加勒比| 欧美三级中文字幕在线观看| 国产精品中文字幕一区| 亚洲av无码精品色午夜蛋壳| 又黄又无遮挡AAAAA毛片| 日本欧美一区二区三区在线播放 | 天堂网av成人在线观看| 精品国产成人A区在线观看| 日本精品aⅴ一区二区三区| 高清无码爆乳潮喷在线观看| 男人和女人做爽爽视频| 日韩在线视频网| 亚洲成av人片在www鸭子| 丰满爆乳一区二区三区| AV最新高清无码专区| 成人国产永久福利看片| 亚洲大尺度无码无码专线| 一本一道av无码中文字幕麻豆| 国产精品久久中文字幕| 中文字幕无码免费不卡视频| 视频二区中文字幕在线|