最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ASP.NET泛型一之泛型簡(jiǎn)介與基本語(yǔ)法

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

".NET泛型"系列:

ASP.NET泛型一之泛型簡(jiǎn)介與基本語(yǔ)法

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

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

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

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

為什么需要泛型

不用泛型

來(lái)看一個(gè)比較類(lèi)型的方法。

    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)一:不是類(lèi)型安全

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

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

這時(shí),看到編譯器報(bào)錯(cuò)。從這點(diǎn)來(lái)看,AreEqual()方法不是類(lèi)型安全的方法,當(dāng)輸入string類(lèi)型,編譯器就會(huì)報(bào)錯(cuò)。

如果把AreEqual()方法的參數(shù)類(lèi)型改成object,編譯器就不再報(bào)錯(cuò)。

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

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

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

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

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

在運(yùn)行時(shí),當(dāng)整型值類(lèi)型參數(shù)1和2傳遞、賦值給AreEqual(object value1, object value2)中的引用類(lèi)型參數(shù)value1和value2的時(shí)候,發(fā)生了一次"裝箱"操作。而當(dāng)把引用類(lèi)型轉(zhuǎn)換成值類(lèi)型的時(shí)候,又會(huì)發(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)了方法和類(lèi)型的解耦。
2、不會(huì)造成類(lèi)型轉(zhuǎn)換,規(guī)避了因裝箱于拆箱引起的性能問(wèn)題。
3、泛型保證了類(lèi)型的絕對(duì)安全。

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

    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)行時(shí)本質(zhì)

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

泛型語(yǔ)法

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ù)類(lèi)型:

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

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

myData = default(T);

泛型約束:

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

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

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

典型的泛型類(lèi)

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

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

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

相關(guān)文章

  • asp.net AjaxControlToolKit--TabContainer控件的介紹

    asp.net AjaxControlToolKit--TabContainer控件的介紹

    ModalPopup控件允許一個(gè)asp頁(yè)面的部分內(nèi)容以對(duì)話框的模式顯示給用戶,同時(shí)會(huì)限制用戶于頁(yè)面的其他部分交互。對(duì)話框顯示的內(nèi)容可以是一個(gè)層級(jí),這個(gè)層級(jí)的背景可以使用戶自定義的格式,簡(jiǎn)單的理解好比是一個(gè)對(duì)話框彈出來(lái)后,主頁(yè)面會(huì)顯示灰色,且不可操作。
    2009-06-06
  • .Net中的弱引用字典WeakDictionary和ConditionalWeakTable介紹

    .Net中的弱引用字典WeakDictionary和ConditionalWeakTable介紹

    這篇文章介紹了.Net中的弱引用字典WeakDictionary和ConditionalWeakTable,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Asp.net中static變量和viewstate的使用方法(謹(jǐn)慎)

    Asp.net中static變量和viewstate的使用方法(謹(jǐn)慎)

    如在頁(yè)面中統(tǒng)計(jì)某個(gè)按鈕被按下的次數(shù),先在類(lèi)中OnClick事件的處理過(guò)程前定義一static變量times,則每次調(diào)用該按鈕的OnClick事件時(shí),令times增1即可,非常方便,接下來(lái)詳細(xì)介紹,感興趣的朋友可以了解下
    2013-01-01
  • asp.net CommunityServer中的wwwStatus

    asp.net CommunityServer中的wwwStatus

    最近不得不對(duì)這個(gè)論壇進(jìn)行研究,以適應(yīng)后面的發(fā)展,現(xiàn)在同事研究太吃力了,以后改些東西,估計(jì)又要...打開(kāi)web項(xiàng)目中的communityserver.config發(fā)現(xiàn)一個(gè)有趣的地方。
    2009-03-03
  • ASP.NET顯示農(nóng)歷時(shí)間的方法

    ASP.NET顯示農(nóng)歷時(shí)間的方法

    這篇文章主要介紹了ASP.NET顯示農(nóng)歷時(shí)間的方法,涉及時(shí)間的換算與數(shù)組的應(yīng)用,是非常具有實(shí)用價(jià)值的技巧,需要的朋友可以參考下
    2014-11-11
  • ASP.NET Core使用NLog輸出日志記錄

    ASP.NET Core使用NLog輸出日志記錄

    這篇文章介紹了ASP.NET Core使用NLog輸出日志記錄的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • asp.net EncryptHelper 加密幫助類(lèi)

    asp.net EncryptHelper 加密幫助類(lèi)

    EncryptHelper 加密幫助類(lèi)
    2010-01-01
  • ASP.NET 中文顯示之兩種解決方法

    ASP.NET 中文顯示之兩種解決方法

    作者剛開(kāi)始寫(xiě)ASP+程序時(shí)候碰到的第一個(gè)比較大的問(wèn)題就是中文顯示問(wèn)題,運(yùn)行后發(fā)現(xiàn)ASP+從數(shù)據(jù)庫(kù)中讀出來(lái)的中文全部變成了?????,有點(diǎn)類(lèi)似jsp中的這個(gè)頻率出現(xiàn)最高的中文顯示問(wèn)題了,查了資料發(fā)現(xiàn)有種方法可以輕松解決中文問(wèn)題。
    2008-05-05
  • 建立自定義的數(shù)據(jù)驅(qū)動(dòng)的本地化資源provider

    建立自定義的數(shù)據(jù)驅(qū)動(dòng)的本地化資源provider

    本文探討了自定義的本地化資源提供者.如果想用一個(gè)可替代系統(tǒng)的資源處理方案,例如把所有的資源放入數(shù)據(jù)庫(kù)中,而不是放在分散的資源文件里,你可以自定義一個(gè)resource provider.
    2010-06-06
  • ASP.NET設(shè)計(jì)網(wǎng)絡(luò)硬盤(pán)之查看文件夾實(shí)現(xiàn)代碼

    ASP.NET設(shè)計(jì)網(wǎng)絡(luò)硬盤(pán)之查看文件夾實(shí)現(xiàn)代碼

    下面要介紹的實(shí)例包括網(wǎng)上硬盤(pán)的許多功能,將一步步為大家進(jìn)行介紹。首先創(chuàng)建工程實(shí)例,然后進(jìn)行主界面的設(shè)計(jì),最后對(duì)各個(gè)功能的實(shí)現(xiàn)分別進(jìn)行介紹
    2012-10-10

最新評(píng)論

梨树县| 宝鸡市| 大埔县| 岫岩| 吕梁市| 金寨县| 临汾市| 绥棱县| 阳曲县| 噶尔县| 新蔡县| 紫云| 疏勒县| 寿阳县| 万源市| 自治县| 长顺县| 怀化市| 芮城县| 丰原市| 萝北县| 旬阳县| 惠来县| 隆回县| 桐乡市| 兴义市| 射洪县| 东海县| 山阳县| 光山县| 石楼县| 若尔盖县| 勃利县| 新兴县| 勐海县| 通许县| 陵川县| 安多县| 新巴尔虎左旗| 桐城市| 沾益县|