乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      C#高級編程之泛型一(泛型的引入、泛型的使用、何為泛型)

       新進(jìn)小設(shè)計 2021-03-14

      為何引入泛型

      當(dāng)我們要對不同類型的參數(shù)執(zhí)行類似的方法時:如下所示功能打印傳入?yún)?shù)的相關(guān)信息。

      class CommonMethdod
          {
              /// <summary>
              /// show int 
              /// </summary>
              public static void ShowParam(int iParam)
              {
                  Console.WriteLine($"this is {typeof(CommonMethdod)},type={iParam.GetType().Name},param={iParam}");
              }
              public static void ShowParam(string sParam)
              {
                  Console.WriteLine($"this is {typeof(CommonMethdod)},type={sParam.GetType().Name},param={sParam}");
              }
      }

      只是參數(shù)的不同,函數(shù)體以及函數(shù)名稱都相同,很快我們想到了一種替代方案:將函數(shù)形參改為Object。

      public static void ShowParam(object oParam)//函數(shù)聲明oParam為object,但是實參為其子類-->LSP。
              {
                  Console.WriteLine($"this is {typeof(CommonMethdod)},type={oParam.GetType().Name},param={oParam}");
              }

      這似乎能解決我們的問題,一個方法可以適用于所有類型。之所以能解決的原因是:

      Object是所有類的基類; 任何父類出現(xiàn)的地方(Object作為函數(shù)簽名的形參),都可以用子類代替[實際傳入實參](里氏替換原則LSP)。
      但是其會存在這樣的問題:

      1. 性能問題:會出現(xiàn)裝箱與拆箱 。此處為 int->object(裝箱),object->int實際類型(拆箱);

      對于裝箱拆箱的問題,這里就要了解C#裝箱與拆箱的內(nèi)部操作和C#內(nèi)存模型。

      詳情請移步至:

      https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/types/boxing-and-unboxing

      https://blog.csdn.net/qiaoquan3/article/details/51439726

      2.類型安全問題(泛型約束可解決)。如下所示:

       

      程序編譯通過,但是運行期間會拋異常,對于這種以O(shè)bject作為基類來進(jìn)行裝箱拆箱的操作存在類型安全隱患。那在C#2.0泛型提出來后就很好的解決了這兩個問題。

      關(guān)于泛型約束的問題,明天再寫。。。。

      那泛型到底怎么使用呢?

      泛型的使用:

      如下所示為泛型方法的使用:

      /// <summary>
              /// 泛型方法代替上一個Object方法
              /// </summary>
              /// <typeparam name="T"></typeparam>
              /// <param name="tParam"></param>
              public static void ShowParam<T>(T tParam)
              {
                  Console.WriteLine($"this is {typeof(T)},type={tParam.GetType().Name},param={tParam}");
              }

      我們在客戶端調(diào)用,代碼如下:

          class Program
          {
              static void Main(string[] args)
              {
      Console.WriteLine("***********************Common********************"); CommonMethdod.ShowParam(
      1); CommonMethdod.ShowParam("abc"); Console.WriteLine("***********************Object********************"); object obj = 3.1415926; CommonMethdod.ShowParam(obj); Console.WriteLine("***********************Generic********************"); string str = "efg"; int intVal = 0; CommonMethdod.ShowParam<string>(str); CommonMethdod.ShowParam<int>(intVal); Console.ReadKey(); } }

      結(jié)果如下:

      泛型的定義

       泛型將類型參數(shù)的概念引入 .NET,這樣就可設(shè)計具有以下特征的類和方法:在客戶端代碼聲明并初始化這些類或方法之前,這些類或方法會延遲指定一個或多個類型。其兼具可重用性、類型安全性和效率,這是非泛型類和非泛型方法無法實現(xiàn)的。

      總結(jié):

      • 使用泛型類型可以最大限度地重用代碼、保護(hù)類型安全性以及提高性能。
      • 泛型最常見的用途是創(chuàng)建集合類。
      • .NET 類庫在 System.Collections.Generic 命名空間中包含幾個新的泛型集合類。 應(yīng)盡可能使用這些類來代替某些類,如 System.Collections 命名空間中的 ArrayList
      • 可以創(chuàng)建自己的泛型接口、泛型類、泛型方法、泛型事件和泛型委托。
      • 可以對泛型類進(jìn)行約束以訪問特定數(shù)據(jù)類型的方法。
      • 在泛型數(shù)據(jù)類型中所用類型的信息可在運行時通過使用反射來獲取。

      下章概括:

      如何對泛型類以及泛型方法進(jìn)行約束以范文特定數(shù)據(jù)類型。

      如何創(chuàng)建自己的泛型接口、泛型類、泛型方法、泛型事件和泛型委托。

      如何通過反射獲取泛型數(shù)據(jù)類型進(jìn)行相關(guān)操作。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多