欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.NET泛型一之泛型簡介與基本語法

 更新時間:2022年08月13日 11:27:27   作者:Darren?Ji  
這篇文章介紹了ASP.NET泛型的簡介與基本語法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

".NET泛型"系列:

ASP.NET泛型一之泛型簡介與基本語法

ASP.NET泛型二之泛型的使用方法

ASP.NET泛型三之使用協(xié)變和逆變實(shí)現(xiàn)類型轉(zhuǎn)換

ASP.NET泛型四之使用Lazy<T>實(shí)現(xiàn)延遲加載

.NET泛型或許是借鑒于C++泛型模版,借助它可以實(shí)現(xiàn)對類型的抽象化、泛型處理,實(shí)現(xiàn)了類型和方法之間的解耦。一個最經(jīng)典的運(yùn)用是在三層架構(gòu)中,針對不同的領(lǐng)域模型,在基接口、基類中實(shí)現(xiàn)針對各個領(lǐng)域模型的泛型處理。

為什么需要泛型

不用泛型

來看一個比較類型的方法。

    public class Calculator
    {
        public static bool AreEqual(int value1, int value2)
        {
            return value1 == value2;
        }
    }

在客戶端調(diào)用。

    class Program
    {
        static void Main(string[] args)
        {
            bool result = Calculator.AreEqual(1, 2);
            if (result)
            {
                Console.WriteLine("相等");
            }
            else
            {
                Console.WriteLine("不等");
            }
            Console.ReadKey();
        }
    }

運(yùn)行結(jié)果:不等

不用泛型的缺點(diǎn)一:不是類型安全

如果我們想使用現(xiàn)在的方法來比較字符串類型。

bool result = Calculator.AreEqual("A", "B");

這時,看到編譯器報錯。從這點(diǎn)來看,AreEqual()方法不是類型安全的方法,當(dāng)輸入string類型,編譯器就會報錯。

如果把AreEqual()方法的參數(shù)類型改成object,編譯器就不再報錯。

    public class Calculator
    {
        public static bool AreEqual(object value1, object value2)
        {
            return value1 == value2;
        }
    }

以上,運(yùn)行也正常。

不用泛型的缺點(diǎn)二:裝箱與拆箱導(dǎo)致性能降低

現(xiàn)在,對于AreEqual(object value1, object value2),從方法本身來講是沒有問題的,但在客戶端調(diào)用的時候,比如我們還是想比較值類型。

bool result = Calculator.AreEqual(1, 2);

在運(yùn)行時,當(dāng)整型值類型參數(shù)1和2傳遞、賦值給AreEqual(object value1, object value2)中的引用類型參數(shù)value1和value2的時候,發(fā)生了一次"裝箱"操作。而當(dāng)把引用類型轉(zhuǎn)換成值類型的時候,又會發(fā)生一次"拆箱"操作,這導(dǎo)致性能的降低。

使用泛型

把AreEqual()改成泛型方法。

    public class Calculator
    {
        public static bool AreEqual<T>(T value1, T value2)
        {
            return value1.Equals(value2);
        }
    }

于是,在客戶端可以這樣:

bool result = Calculator.AreEqual<string>("A", "A"); 
bool result = Calculator.AreEqual<int>(5, 3);

由此,使用泛型的好處有:
1、實(shí)現(xiàn)了方法和類型的解耦。
2、不會造成類型轉(zhuǎn)換,規(guī)避了因裝箱于拆箱引起的性能問題。
3、泛型保證了類型的絕對安全。

當(dāng)然,還可以把T的位置放在類上:

    public class Calculator<T>
    {
        public static bool AreEqual(T value1, T value2)
        {
            return value1.Equals(value2);
        }
    }

然后這樣使用:

bool result = Calculator<string>.AreEqual("A", "A"); 
bool result = Calculator<int.AreEqual(1, 2);

泛型的運(yùn)行時本質(zhì)

CLR中有專門的IL指令支持泛型操作。
→初次編譯時,生成IL代碼和元數(shù)據(jù),T只是類型占位符,在編譯時不進(jìn)行實(shí)例化
→JIT編譯時,以實(shí)際類型替換元數(shù)據(jù)中的T占位符
→將元數(shù)據(jù)轉(zhuǎn)換為本地代碼

泛型語法

class MyArray<T> where T : Student, new()
{
    private T[] _items;
    public T myData;

    public MyArray()
    {
        myData = default(T);
    }

    public void Add(T item)
    {}
}

創(chuàng)建泛型實(shí)例要指定實(shí)際的數(shù)據(jù)類型:

MyArray<Int32> myArr = new MyArray<Int32>();

值類型的默認(rèn)值為0,引用類型的默認(rèn)值為null,使用泛型默認(rèn)值:

myData = default(T);

泛型約束:

  • T : 基類名,表示必須是基類名的派生類
  • T :new(), 表示必須具有無參構(gòu)造函數(shù),new()約束必須放在最后面
  • T :struct, 表示必須是值類型
  • T :class, 表示必須是引用類型
  • T :接口名,表示必須實(shí)現(xiàn)該接口,或?qū)崿F(xiàn)該接口的接口

泛型類本質(zhì)上仍然是一個類,依然可以繼承:

internal class GenericeComparer<T> : Comparer<T> where T : IComparable<T>
class MyArray<T> : ArrayList

典型的泛型類

在System.Collections.Generic命名空間和System.Collections.ObjectModel中,定義了不同的泛型類和泛型接口,這些泛型多為集合類。

  • List<T> 對應(yīng)ArrayList集合類
  • SortedList<TKey, TValue> 對應(yīng)SortedList集合類
  • Queue<T> 先進(jìn)先出的集合類
  • Stack<T> 后進(jìn)先出的集合類
  • Collection<T> 自定義泛型集合的基類
  • Dictionary<TKey, TValue> 對應(yīng)于Hashtable集合類

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • ASP.NET MVC實(shí)現(xiàn)依賴注入的完整過程

    ASP.NET MVC實(shí)現(xiàn)依賴注入的完整過程

    這篇文章主要給大家介紹了關(guān)于ASP.NET MVC實(shí)現(xiàn)依賴注入的完整過程,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用ASP.NET MVC具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • CentOS上運(yùn)行ZKEACMS的詳細(xì)過程

    CentOS上運(yùn)行ZKEACMS的詳細(xì)過程

    這篇文章主要為大家介紹了CentOS上運(yùn)行ZKEACMS的詳細(xì)過程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • asp.net中的GridView分頁問題

    asp.net中的GridView分頁問題

    這篇文章主要介紹了asp.net中的GridView分頁問題,實(shí)例講述了采用GridView分頁出現(xiàn)的問題及對應(yīng)的解決方案,非常具有實(shí)用價值,需要的朋友可以參考下
    2014-11-11
  • .NET Core下使用Log4Net記錄日志的方法步驟

    .NET Core下使用Log4Net記錄日志的方法步驟

    這篇文章主要介紹了.NET Core下使用Log4Net記錄日志的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • ASP.NET開源導(dǎo)入導(dǎo)出庫Magicodes.IE完成Csv導(dǎo)入導(dǎo)出的方法

    ASP.NET開源導(dǎo)入導(dǎo)出庫Magicodes.IE完成Csv導(dǎo)入導(dǎo)出的方法

    這篇文章主要介紹了ASP.NET開源導(dǎo)入導(dǎo)出庫Magicodes.IE完成Csv導(dǎo)入導(dǎo)出的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • ASP.NET多文件上傳控件Uploadify的使用方法

    ASP.NET多文件上傳控件Uploadify的使用方法

    這篇文章主要為大家詳細(xì)介紹了ASP.NET文件上傳控件Uploadify的使用方法,感興趣的小伙伴們可以參考一下
    2016-03-03
  • .NET Core授權(quán)失敗自定義響應(yīng)信息的操作方法

    .NET Core授權(quán)失敗自定義響應(yīng)信息的操作方法

    這篇文章主要介紹了.NET Core授權(quán)失敗自定義響應(yīng)信息的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • .NET使用DinkToPdf將HTML轉(zhuǎn)成PDF的示例代碼

    .NET使用DinkToPdf將HTML轉(zhuǎn)成PDF的示例代碼

    這篇文章主要介紹了.NET使用DinkToPdf將HTML轉(zhuǎn)成PDF的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • ASP.NET MVC4使用MongoDB制作相冊管理

    ASP.NET MVC4使用MongoDB制作相冊管理

    這篇文章主要介紹了ASP.NET MVC4使用MongoDB制作相冊管理的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-07-07
  • .NET Core如何進(jìn)行請求轉(zhuǎn)發(fā)的實(shí)現(xiàn)

    .NET Core如何進(jìn)行請求轉(zhuǎn)發(fā)的實(shí)現(xiàn)

    這篇文章主要介紹了.NET Core如何進(jìn)行請求轉(zhuǎn)發(fā)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評論