激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - .net泛型通用函數的特殊問題的解決方法

.net泛型通用函數的特殊問題的解決方法

2019-10-26 12:21asp.net教程網 ASP.NET教程

本文介紹了.net泛型通用函數的特殊問題的解決方法,需要的朋友可以參考一下

自從2.0版本的net framework推出之后泛型(Generic)得到了廣泛好評。它不必像object類型一樣性能上因為“拆箱”或者“裝箱”得到損失,同時在編譯語法檢測階段就可以實時檢測出傳入或者傳出的類型是否符合特定條件。

  但“金無赤足,人無完人”——在我們享受這些幸福編程的同時,泛型自身類型的不確定也帶來了一個顯著的問題——無法進行運算符重載。譬如現在我要寫一個函數(一個通用的選擇排序算法,使用泛型T),該怎么辦呢?如果你簡單使用這樣的代碼(C#如下):

 

復制代碼代碼如下:


//從小到大,改進型選擇排序算法

 

public static void Sort<T>(T[] array)
{
     bool flag = false; //標記是否已經排序

     for(int i=0;i<array.Length-1;++i)
     {
          flag = false;  //每次假定都已經排序,無須再排序

          for(int j=i+1;i<array.Length;++j)
          {
               if(array[i]>array[j])
                {
                      int temp = array[i];
                      array[i]=array[j];
                      array[j]=templ
                      flag = true; //已經排序
                }
          }
           if(!flag)
           {
               break;
           }
     }
}


  編譯之后很快發現提示“運算符‘>'無法作用于T”一類的提示。

 

  為什么呢?我們知道,凡是可以進行大于、小于比較的類型肯定都定義了運算符重載。一般類必須為此定義方可進行比較,不然大于號或者小于號(或者其它運算符)無法知道如何比較而發生錯誤。那么泛型因為事先都不知道什么類型?編譯器檢查器自然無法推斷你運行時動態傳入的這個類型一定保證是實現了運算符重載,嚴格語法檢查情況下就自然報錯。

  怎么辦呢?強制規定泛型T必須實現比較器(強制T必須實現IComparable,或者類似接口)。

 

復制代碼代碼如下:


public static void Sort<T>(T[] array)where T:IComparable
{
     bool flag = false; //標記是否已經排序

 

     for(int i=0;i<array.Length-1;++i)
     {
          flag = false;  //每次假定都已經排序,無須再排序

          for(int j=i+1;i<array.Length;++j)
          {
               if(array[i].Compare(array[j])>0)
                {
                      int temp = array[i];
                      array[i]=array[j];
                      array[j]=templ
                      flag = true; //已經排序
                }
          }
           if(!flag)
           {
               break;
           }
     }
}


  一旦對泛型進行約束,那么泛型必然是實現該接口的類,必然擁有此方法(Compare方法返回結果int類型,如果大于0表示前面一個數字大于后面一個)。

 

  當然,微軟類庫中有一個Comparer靜態類,已經實現了此接口可以直接進行比較(http://msdn.microsoft.com/zh-cn/library/system.collections.comparer.comparer.aspx),因此我們也可以選擇直接使用這個靜態類中的Compare方法得到結果。

  【例2】實現一個通用的“+”——即如果傳入的字符串,則自動按照字符串進行字符拼接;如果傳入的是其它基本類型(int,double等),則返回相加結果。

  微軟沒有為“+”預定義接口,因此無法直接使用接口的方式來做(當然你自己強制定義一個,也可以如法炮制)。我們現在換一個方法——使用表達式樹(C#代碼如下):

 

復制代碼代碼如下:


public static T Add<T>(T a, T b)
        {
            Expression left = Expression.Constant(a);
            Expression right = Expression.Constant(b);

 

            Type t = typeof(T);

            Expression value;

            if (t == typeof(string))
            {
                value = Expression.Constant(a.ToString()+b.ToString());
            }
            else
            {
                value = Expression.Add(left, right);
            }

            Expression<Func<T>> addExp = Expression.Lambda<Func<T>>(value);

            Func<T> addFunc = addExp.Compile();

            return addFunc();
        }


  動態判斷T是string還是其它基本類型,然后調用不同的方法組合成為表達式樹,動態編譯成為一個Func表達式,返回結果即可。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 天天草天天干天天 | 日韩在线播放一区二区 | 免费黄网站在线播放 | 欧美韩国一区 | 亚洲精中文字幕二区三区 | 黄色7777| 一级大片一级一大片 | 中文字幕涩涩久久乱小说 | 一级外国毛片 | 美女羞羞视频在线观看 | 国产福利不卡一区二区三区 | 国产成人在线一区 | 97视频| 特级无码毛片免费视频尤物 | 羞羞的小视频 | 色婷婷久久久亚洲一区二区三区 | 国产九色视频在线观看 | 高清做爰免费无遮网站挡 | 亚洲91在线| 一区二区三区日韩电影 | 久久精品一区视频 | 欧美大胆xxxx肉体摄影 | 又黄又爽免费无遮挡在线观看 | 久久久久国产一区二区三区不卡 | 欧美性受ⅹ╳╳╳黑人a性爽 | 久久艹国产精品 | 亚洲精品欧美二区三区中文字幕 | 九九热在线精品视频 | 色淫网站免费视频 | a视频在线看 | 中文有码一区二区 | 国产乱淫av片免费观看 | 欧美日韩在线视频一区 | av影院在线 | 多人乱大交xxxxx变态 | 国产午夜免费视频 | 日韩一级片一区二区三区 | 日本网站一区二区三区 | 蜜桃网在线观看 | 欧美亚洲国产成人 | 特级毛片免费视频 |