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

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

 更新時間:2013年02月27日 11:51:26   作者:  
本文介紹了.net泛型通用函數(shù)的特殊問題的解決方法,需要的朋友可以參考一下

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

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

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

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

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

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

          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; //已經(jīng)排序
                }
          }
           if(!flag)
           {
               break;
           }
     }
}


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

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

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

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

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

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

          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; //已經(jīng)排序
                }
          }
           if(!flag)
           {
               break;
           }
     }
}


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

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

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

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

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

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

相關(guān)文章

最新評論

蒙自县| 嘉善县| 龙川县| 临澧县| 全州县| 湘潭县| 五莲县| 贵德县| 托克逊县| 澄江县| 阳朔县| 潢川县| 南汇区| 四平市| 华容县| 探索| 四会市| 南部县| 淅川县| 北辰区| 苗栗市| 桓台县| 电白县| SHOW| 彭泽县| 湘乡市| 白水县| 牡丹江市| 湖北省| 纳雍县| 合阳县| 图木舒克市| 福贡县| 白沙| 阿图什市| 普兰店市| 临沭县| 乌兰浩特市| 武义县| 霞浦县| 无极县|