91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣分析.NET泛型的調用

發布時間:2021-12-27 14:30:23 來源:億速云 閱讀:112 作者:柒染 欄目:大數據

本篇文章為大家展示了怎樣分析.NET泛型的調用,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

  總所周知,.NET出現在.net framework 2.0,為什么要在2.0引入泛型那,因為微軟在開始開發.net框架時并沒有想過多個類型參數傳輸時對方法的重構,這樣一來,開發人員就要面對傳輸多種類型的參數而不得以寫多個方法,但是,開發者的智慧是無限的,創造性也由此被挖掘出來,在泛型之前,便有開發者為了提到代碼利用率便想到使用object類型為參數類型來傳遞參數,這無疑解決了多個類型的參數傳輸時并需要寫多個方法的問題。那么object類型為什么能實現接受多個不同類型的參數那?有了object類型還為什么要設計泛型那?object類型又有那么弊端那?其實有點基礎的開發人員應該都知道object類型是所有類型的父類,通過里氏轉換原則我們知道所有父類出現的地方都可以用子類替換,這樣就可以接收多個參數了,同時因為object類型轉換裝拆箱對性能的影響,在2.0時,微軟推出了泛型。

     下面,我們引入泛型的聲明和調用:

public static void Show<T>(T tParameter)
{
   Console.WriteLine($"This is{typeof(GenericClass)}Show<T>,paratype={tParameter.GetType()},value={tParameter};
}

   打印的內容我們沒必要關注,我們只看方法頭,我們可以看到方法頭和參數里面加了T這個字母,其實這就是泛型聲明的規則,泛型在聲明時,需要在方法頭加上<T>(T parm),
注意,尖括號里面的字母是可變的,可以是任何字母,但是尖括號里面的字母必須和參數里面的字母要一致,這樣一個方法就聲明好了。

  下面我們接下來研究下泛型的調用過程,泛型是如何在未命名參數類型的情況下來聲明參數類型的,在下面程序入口我寫了兩個List的類型

class Program

    {

        static void Main(string[] args)

        {

            try

            {

                Console.WriteLine(typeof(List<int>));

                Console.WriteLine(typeof(List<string>));

怎樣分析.NET泛型的調用

    運行我們發現,TList雖然在調用時不知道傳的什么類型,但是加了占位符,那么占位符是什么那?我們從dos里面看到`1,對,這個就是占位符。那么定位符是在什么時候聲明的那?上代碼

class Program

    {

        static void Main(string[] args)

        {

            try

            {

                int iParameter = 123;

                long lParameter = 456;

                string sParameter = "abc";

                object oParameter = "123456";

                Console.WriteLine("**********************");

                CommonClass.ShowInt(iParameter);

                CommonClass.ShowLong(lParameter);

                CommonClass.ShowString(sParameter);

                Console.WriteLine("**********************");

                CommonClass.ShowObject(oParameter);

                CommonClass.ShowObject(iParameter);

                CommonClass.ShowObject(lParameter);

                CommonClass.ShowObject(sParameter);

                Console.WriteLine("**********************");

                GenericClass.Show<object>(oParameter);

                GenericClass.Show<int>(iParameter);

                //GenericClass.Show<int>(lParameter);//指定類型必須和參數一致

                GenericClass.Show(iParameter);//不指定,由編譯器自動推算

                GenericClass.Show<long>(lParameter);

                GenericClass.Show<string>(sParameter);

                Console.WriteLine("**********************");

             }

            catch (Exception ex)

            {

                Console.WriteLine(ex.Message);

            }

            Console.Read();

        }

    }

}

  這里我就不贅述了,直接說一下吧,其實泛型在聲明的時候不知道什么類型(用了占位符),是在調用的時候編譯器自動推算,也可以在調用時指定,這是一種延遲思想延遲聲明:把參數類型的聲明,延遲到調用的時候,推遲一切可以推遲的,這也是設計模式的一種思想。編譯以后的泛型和普通方法就一樣了,所以不會影響性能,可以想象成又一個重載

泛型的好處:一個方法支持多種參數類型 ,性能無損耗。

泛型支持多個參數可想而知,但是真的無損耗嗎?不清楚,好,對一切我們要持一種懷疑的態度去看,科學的自然會被證實,那么這里我們測試一下。用到類:Stopwatch

long commonTime = 0;

                long objectTime = 0;

                long genericTime = 0;

                {

                    Stopwatch watch = new Stopwatch();

                    watch.Start();

                    for (int i = 0; i < 100000000; i++)

                    {

                        CommonClass.ShowObject(iParameter);

                    }

                    watch.Stop();

                    objectTime = watch.ElapsedMilliseconds;

                }

                {

                    Stopwatch watch = new Stopwatch();

                    watch.Start();

                    for (int i = 0; i < 100000000; i++)

                    {

                        CommonClass.ShowInt(iParameter);

                    }

                    watch.Stop();

                    commonTime = watch.ElapsedMilliseconds;

                }

                {

                    Stopwatch watch = new Stopwatch();

                    watch.Start();

                    for (int i = 0; i < 100000000; i++)

                    {

                        GenericClass.Show<int>(iParameter);

                    }

                    watch.Stop();

                    genericTime = watch.ElapsedMilliseconds;

                }

                Console.WriteLine("commonTime={0}", commonTime);

                Console.WriteLine("objectTime={0}", objectTime);

                Console.WriteLine("genericTime={0}", genericTime);

里面的三個類分別是object類型和普通類以及泛型,分別對int、string以及實體類型的調用,我直接上答案:
怎樣分析.NET泛型的調用

    通過圖上給出的運行時間,泛型是最快的,然后是普通方法,然后是object類型,大家要知道,我這是在運行1億次的情況下的所得的結果,其實,我們還得出一個結論,那就是,object類型確實有性能影響,單并不罪大惡極,也不是不能用的,也要看程序所處的環境。

上述內容就是怎樣分析.NET泛型的調用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

成安县| 久治县| 遂川县| 富阳市| 扬州市| 孟连| 莱西市| 鹿邑县| 河曲县| 定西市| 莱芜市| 刚察县| 襄汾县| 盱眙县| 宜章县| 喜德县| 图木舒克市| 大兴区| 敦化市| 宣威市| 岚皋县| 遵义县| 恩平市| 大渡口区| 黔江区| 古丈县| 大足县| 中方县| 漳浦县| 和顺县| 共和县| 东方市| 阿巴嘎旗| 南郑县| 辉县市| 兴隆县| 贵南县| 新巴尔虎左旗| 长海县| 定陶县| 昭通市|