NET 泛型,詳細介紹

来源:https://www.cnblogs.com/szlblog/archive/2019/04/14/10703770.html
-Advertisement-
Play Games

今天的文章是因為再給一個朋友講這個的時候隨手記錄下整理出來的。說白了就是把前輩們曾經給我吹過的我又吹了出去。 泛型:是C# FrameWork 2.0 時代 加入進來的,可以說對與Net開發人員來說泛型是無處不再的,喜歡看源碼的同學,可能會有發現,包括MVC裡面基本上也是有很多發泛型,還有很多設計模 ...


今天的文章是因為再給一個朋友講這個的時候隨手記錄下整理出來的。說白了就是把前輩們曾經給我吹過的我又吹了出去。

   

  泛型:是C# FrameWork 2.0 時代 加入進來的,可以說對與Net開發人員來說泛型是無處不再的,喜歡看源碼的同學,可能會有發現,包括MVC裡面基本上也是有很多發泛型,還有很多設計模式也需要搭配泛型來實現,包括項目架構

泛型的存在,是代碼利用率復用性都大大的提升了,有時候Object 也是可以起到相同的作用,為什麼使用泛型 為什麼不是用Obj ,我們來看一下:

  下麵我們列出兩個最基礎的方法:

        /// <summary>
        /// 返回int
        /// </summary>
        /// <param name="I"></param>
        /// <returns></returns>
        public int ShowInt(int I)
        {
            return I;
        }
        /// <summary>
        /// 返回String
        /// </summary>
        /// <param name="I"></param>
        /// <returns></returns>
        public string  ShowString (string I)
        {
            return I;
        }

  上面的兩個方法自從參數 進來到參數出去的這一個過程中我們沒有進行參數方面的轉換,也就是說單純的針對的參數類型上面我們程式代碼是沒有損失任何的性能的。一位沒有存在拆箱裝箱的過程。

  我們在看兩個方法:我們使用了在C# 1.0 時代就存在的一個類型 是Object
  

        /// <summary>
        /// 返回int
        /// </summary>
        /// <param name="I"></param>
        /// <returns></returns>
        public int ShowString(object I)
        {
            return Convert.ToInt32(I);
        }
        /// <summary>
        /// 返回String
        /// </summary>
        /// <param name="I"></param>
        /// <returns></returns>
        public string ShowString(object I)
        {
            return I.ToString();
        }

   這裡我們使用的闡述類型是Obj ,Object 是引用類型,也是所有類型的父類,可以包容所有的類型,但是就單說處理參數類型的時候我們需要去轉換一下才能進行使用,在這個轉換的過程中我們已經損失了性能,但是使用Obj 的時候我們可以和成一個方法減少代碼量,提升了代碼的復用率。

  比如:

        /// <summary>
        /// 返回object
        /// </summary>
        /// <param name="I"></param>
        /// <returns></returns>
        public object ShowType(object I)
        {
            return I;
        }

  現在簡寫成為這樣後,我們是一個公用的方法:雖然說內部不用去轉換了但是,在調用後,還是需要類型的轉換同樣的需要損失性能。中間性能之所以會損失是因為Obj是引用類型,存放在堆上的,假如說我們傳的參數是int或其他的值類型來使用我們的公共方法,就會進行一次包裝的過程,把存放在棧裡面的值類型移動包裝成為引用類型存放到堆裡面,使參數符合當前方法的類型,這個過成也就是裝箱(需要重新分配記憶體),但是我們在使用的時候,又需要把他拿出來進行一下裝換轉換為值類型,這個過程又稱為拆箱

  我們在來使用一個方法:使用 2.0時代出現的泛型:

        /// <summary>
        /// 返回 T
        /// </summary>
        /// <param name="Parameter"></param>
        /// <returns></returns>
        public T Show<s>(T Parameter)
        {
            return Parameter;
        }

  為什麼會使用泛型 是因為泛型方法再調用的時候有延時聲明的功能這裡的延時聲明式只參數,泛型裡面的 T ,其實咱們也可以理解為 占位符具體為誰占位的,等到調用的時候才會知道。

  如下:

    int parameter = 0;
    //在調用的時候聲明參數類型
    parameter = new Common().Show<int>(parameter);
    //如果調用的時候不去聲明的話,JIT編譯的時候野會幫我們自動計算
    parameter = new Common().Show(parameter);

  這個時候不會損耗什麼性能。延時聲明也是咱們在進行框架設計的時候常用的一種思想,提高框架的性能。泛型不只是可以聲明泛型方法:

  泛型類:

    /// <summary>
    /// CURD 操作類
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ConmonClass<T>
    {
        public void Add(T s) { };
        public void Update(T s) { };
        public void Del(T s) { };
        public void Select(T s) { }; 
    }

  這樣使用的話,在咱們真正的項目,我們可以把某些基礎的操作用一個類去搞定,使用的時候調用就是了,減少代碼的冗餘,增加復用性,重用率。

  泛型介面:

    /// <summary>
    /// CURD 操作介面類
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface ConmonInterface<T>
    {
        T Add(T s);
        T Update(T s);
        T Del(T s);
        T Select(T s);
    }

  泛型委托:

//泛型委托
public delegate T GetHandler<T>();

  我想以上的操作在我們開發項目的時候會經常見到,或使用到

  以上代碼需要我們註意的時候,泛型類不能被繼承,如果想要繼承的話需要在繼承的時候,給我們的不確定參數確定下參數類型。包括泛型介面也是一樣的。

  如下:

    public class Son : ConmonClass<Common>
    {};
    /// <summary>
    /// 實現泛型介面
    /// </summary>
    public class SonInterface : ConmonInterface<Common>
    {
        public Common Add(Common s)
        {
            throw new NotImplementedException();
        }

        public Common Del(Common s)
        {
            throw new NotImplementedException();
        }

        public Common Select(Common s)
        {
            throw new NotImplementedException();
        }

        public Common Update(Common s)
        {
            throw new NotImplementedException();
        }
     }

  如果說不指定泛型類型的參數類型式其實我們一樣是可以繼承的。需用繼承者同樣是泛型的

  建議:長期使用Net的同學我想我們需要加強一下泛型的認識了,因為在NetCore中常常會使用依賴註入,在使用泛型類的時候我們可能會多少有點麻煩的,泛型方法相對來說要簡單的,如果說要想讓我們的框架實現高度的內聚,大家需要多多理解。

  泛型的約束,多重約束相當重要,代表我們是否能很好的利用泛型。

  泛型的約束類型大概分為如下幾種:

引用類型約束:

表明泛型參數只能是引用類型的:

值類型約束:

表明泛型參數只能是值類型的:

無參數構造函數約束:

泛型是可以實例化的。

基類約束

必須滿足基類中的某些屬性

介面約束

必須滿足介面中的某些屬性

  

 

 

 

 

 

 

具體的就不代碼了。

  

有不足之處 希望大家指出相互學習,

            本文原創:轉載請註明出處 謝謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、AQS概念 1、隊列同步器是用來構建鎖或者其他同步組件的基礎框架,使用一個int型變數代表同步狀態,通過內置的隊列來完成線程的排隊工作。 2、下麵是JDK8文檔中對於AQS的部分介紹 總結來說就是: ①子類通過繼承AQS並實現其抽象方法來管理同步狀態,對於同步狀態的更改通過提供的getState ...
  • 最近項目需要實現根據關鍵字搜索pdf內容,實現思路就是提取pdf文本,然後進行索引。 工具上選擇: IText 4.16之後採用agpl License,不能用作商用,而且轉換中文會有亂碼問題, pdfsharp 採用MIT License,許可權上沒有問題,但是轉換中文也會有亂碼, 最後決定採用xp ...
  • 最近有很多朋友去目前主流的大型互聯網公司面試(阿裡巴巴、京東、美團、滴滴),面試回來之後會發給我一些面試題。有些朋友輕鬆過關,拿到offer,但是有一些是來詢問我答案的。 其實本來真的沒打算寫這篇文章,主要是自己得記憶力不是很好,不像一些記憶力強的人,面試完以後,幾乎能把自己和麵試官的對話都給記下來 ...
  • 1 前言 由於Python的版本眾多,還有Python2和Python3的爭論,因此有些軟體包或第三方庫就容易出現版本不相容的問題。 通過 這個工具,就可以構建一系列 ,然後在每個環境中安裝需要的軟體包(配合 使用),這一系列的環境是相互隔離的。作為一個獨立的環境就不容易出現版本問題,還方便部署。 ...
  • 寫在前面:所有題目都是用python寫的,有一些題目懶得重頭寫,直接用python自帶的功能或庫造好的“輪子” 一、開始之前 1、只出現一次的數字 說明: 示例 1: 示例 2: 2、求眾數 示例 1: 示例 2: 3、搜索二維矩陣 II 示例: 現有矩陣 matrix 如下: [ [1, 4, 7 ...
  • 昨天補充: 編碼: Unicode ; utf-8 ; GBK 關係: 關鍵字:1. continue 終止當前迴圈,進行下一次迴圈 2. break 終止迴圈 題6解法2: 今日內容:Python的開發IDE—Pycharm IDE:Pycharm、eclipse pycharm比較好用點..>> ...
  • thinkphp框架,是一堆代碼(常量,方法,和類)的集合,框架是一個半成品的應用,還包含一些優秀的設計模式。 框架的使用,代碼風格不一樣,維護難,項目生命周期短,功能擴展存在局限,好處為,簡單,快捷,高效,不需要關註底層結構,專註於業務邏輯 zend framework,官方框架,yii框架,美國 ...
  • JVM 調優概述 性能定義 吞吐量 - 指不考慮 GC 引起的停頓時間或記憶體消耗,垃圾收集器能支撐應用達到的最高性能指標。 延遲 - 其度量標準是縮短由於垃圾啊收集引起的停頓時間或者完全消除因垃圾收集所引起的停頓,避免應用運行時發生抖動。 記憶體占用 - 垃圾收集器流暢運行所需要的記憶體數量。 調優原則 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...