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

爲什麼引入泛型

當咱們要對不一樣類型的參數執行相似的方法時:以下所示功能打印傳入參數的相關信息。api

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

這彷佛能解決咱們的問題,一個方法能夠適用於全部類型。之因此能解決的緣由是:ide

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

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

對於裝箱拆箱的問題,這裏就要了解C#裝箱與拆箱的內部操做和C#內存模型。性能

詳情請移步至:ui

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

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

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

 

程序編譯經過,可是運行期間會拋異常,對於這種以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,這樣就可設計具備如下特徵的類和方法:在客戶端代碼聲明並初始化這些類或方法以前,這些類或方法會延遲指定一個或多個類型。其兼具可重用性、類型安全性和效率,這是非泛型類和非泛型方法沒法實現的。

總結:

  • 使用泛型類型能夠最大限度地重用代碼、保護類型安全性以及提升性能。
  • 泛型最多見的用途是建立集合類。
  • .NET 類庫在 System.Collections.Generic 命名空間中包含幾個新的泛型集合類。 應儘量使用這些類來代替某些類,如 System.Collections 命名空間中的 ArrayList
  • 能夠建立本身的泛型接口、泛型類、泛型方法、泛型事件和泛型委託。
  • 能夠對泛型類進行約束以訪問特定數據類型的方法。
  • 在泛型數據類型中所用類型的信息可在運行時經過使用反射來獲取。

下章歸納:

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

如何建立本身的泛型接口、泛型類、泛型方法、泛型事件和泛型委託。

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

相關文章
相關標籤/搜索