小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 新進小設計 2021-03-14

為何引入泛型

當我們要對不同類型的參數執(zhí)行類似的方法時:如下所示功能打印傳入參數的相關信息。

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}");
        }
}

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

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

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

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

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

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

詳情請移步至:

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

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

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

 

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

關于泛型約束的問題,明天再寫。。。。

那泛型到底怎么使用呢?

泛型的使用:

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

/// <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}");
        }

我們在客戶端調用,代碼如下:

    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(); } }

結果如下:

泛型的定義

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

總結:

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

下章概括:

如何對泛型類以及泛型方法進行約束以范文特定數據類型。

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

如何通過反射獲取泛型數據類型進行相關操作。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多