婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > .net泛型通用函數(shù)的特殊問題的解決方法

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

熱門標(biāo)簽:玉林市機(jī)器人外呼系統(tǒng)哪家好 南陽外呼系統(tǒng)定制化 蘋果手機(jī)凱立德地圖標(biāo)注 申請(qǐng)400電話手續(xù) 百度ai地圖標(biāo)注 電話機(jī)器人軟件銷售工作 同安公安400電話怎么申請(qǐng)流程 合肥電銷外呼系統(tǒng)哪家公司做的好 預(yù)測(cè)式外呼系統(tǒng)使用說明

  自從2.0版本的net framework推出之后泛型(Generic)得到了廣泛好評(píng)。它不必像object類型一樣性能上因?yàn)椤安鹣洹被蛘摺把b箱”得到損失,同時(shí)在編譯語法檢測(cè)階段就可以實(shí)時(shí)檢測(cè)出傳入或者傳出的類型是否符合特定條件。

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

復(fù)制代碼 代碼如下:

//從小到大,改進(jìn)型選擇排序算法

public static void SortT>(T[] array)
{
     bool flag = false; //標(biāo)記是否已經(jīng)排序

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

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


  編譯之后很快發(fā)現(xiàn)提示“運(yùn)算符‘>'無法作用于T”一類的提示。

  為什么呢?我們知道,凡是可以進(jìn)行大于、小于比較的類型肯定都定義了運(yùn)算符重載。一般類必須為此定義方可進(jìn)行比較,不然大于號(hào)或者小于號(hào)(或者其它運(yùn)算符)無法知道如何比較而發(fā)生錯(cuò)誤。那么泛型因?yàn)槭孪榷疾恢朗裁搭愋??編譯器檢查器自然無法推斷你運(yùn)行時(shí)動(dòng)態(tài)傳入的這個(gè)類型一定保證是實(shí)現(xiàn)了運(yùn)算符重載,嚴(yán)格語法檢查情況下就自然報(bào)錯(cuò)。

  怎么辦呢?強(qiáng)制規(guī)定泛型T必須實(shí)現(xiàn)比較器(強(qiáng)制T必須實(shí)現(xiàn)IComparable,或者類似接口)。

復(fù)制代碼 代碼如下:

public static void SortT>(T[] array)where T:IComparable
{
     bool flag = false; //標(biāo)記是否已經(jīng)排序

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

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


  一旦對(duì)泛型進(jìn)行約束,那么泛型必然是實(shí)現(xiàn)該接口的類,必然擁有此方法(Compare方法返回結(jié)果int類型,如果大于0表示前面一個(gè)數(shù)字大于后面一個(gè))。

  當(dāng)然,微軟類庫中有一個(gè)Comparer靜態(tài)類,已經(jīng)實(shí)現(xiàn)了此接口可以直接進(jìn)行比較(http://msdn.microsoft.com/zh-cn/library/system.collections.comparer.comparer.aspx),因此我們也可以選擇直接使用這個(gè)靜態(tài)類中的Compare方法得到結(jié)果。

  【例2】實(shí)現(xiàn)一個(gè)通用的“+”——即如果傳入的字符串,則自動(dòng)按照字符串進(jìn)行字符拼接;如果傳入的是其它基本類型(int,double等),則返回相加結(jié)果。

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

復(fù)制代碼 代碼如下:

public static T AddT>(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);
            }

            ExpressionFuncT>> addExp = Expression.LambdaFuncT>>(value);

            FuncT> addFunc = addExp.Compile();

            return addFunc();
        }


  動(dòng)態(tài)判斷T是string還是其它基本類型,然后調(diào)用不同的方法組合成為表達(dá)式樹,動(dòng)態(tài)編譯成為一個(gè)Func表達(dá)式,返回結(jié)果即可。

您可能感興趣的文章:
  • asp.net實(shí)現(xiàn)利用反射,泛型,靜態(tài)方法快速獲取表單值到Model的方法
  • 詳解.NET 4.0中的泛型協(xié)變(covariant)和反變(contravariant)
  • .NET基礎(chǔ)之自定義泛型分析
  • .NET開發(fā)基礎(chǔ):從簡(jiǎn)單的例子理解泛型 分享
  • 使用.NET中的Action及Func泛型委托深入剖析
  • .NET CORE動(dòng)態(tài)調(diào)用泛型方法詳解

標(biāo)簽:揚(yáng)州 南京 海南 南昌 嘉興 臺(tái)州 淄博 南京

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《.net泛型通用函數(shù)的特殊問題的解決方法》,本文關(guān)鍵詞  .net,泛型,通用,函數(shù),的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《.net泛型通用函數(shù)的特殊問題的解決方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于.net泛型通用函數(shù)的特殊問題的解決方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 永胜县| 龙口市| 油尖旺区| 马龙县| 洪江市| 榕江县| 集安市| 运城市| 色达县| 玉林市| 衢州市| 乳源| 夏邑县| 比如县| 东阳市| 江油市| 巫溪县| 永州市| 察雅县| 武乡县| 星子县| 漳浦县| 青冈县| 东阳市| 甘南县| 射阳县| 多伦县| 日土县| 山东省| 蕉岭县| 搜索| 来宾市| 黄浦区| 邵阳县| 时尚| 红安县| 宁南县| 双桥区| 神农架林区| 白城市| 白银市|