国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

每天一段代碼-說說泛型

2019-11-17 02:21:12
字體:
供稿:網(wǎng)友

每天一段代碼-說說泛型

什么是泛型

  假設(shè)你有一個算法,代碼如下:

        static int Calculate(int number1, int number2)        {            return number1 + number2;        }

  現(xiàn)在,你的項目要增加對double類型的支持,So Easy?。?!,你很聰明的拷貝了上面的代碼,三下五除二,將int全都改成double

        static double Calculate(double number1, double number2)        {            return number1 + number2;        }

  再然后你的代碼又要增加對新的類型的支持,比如short,byte,string,float...,你已經(jīng)無法忍受了不斷的Ctrl+C,Ctrl+V,

  那么有什么辦法可以讓我們不再重復(fù)做著這樣的工作呢?就是今天的主角——C#泛型特性。泛型允許我們聲明類型參數(shù)化的代碼,我們可以用不同的類型進行實例化,就好像我們給所有的類型創(chuàng)建了一個模板,然后到真正使用到某個類型的時候,我們在把該類型套用進去??磦€例子,

  現(xiàn)在我再換種類型試試

  它依然能夠很好的工作,我們可以看下Sort<T>里面的代碼,里面確實沒有具體的類型

1         public static void Sort<T>(T[] array) {2             if (array==null)3                 throw new ArgumentNullException("array");4             Contract.EndContractBlock();5             Sort<T>(array, array.GetLowerBound(0), array.Length, null);6         }

  在C#中,支持泛型的有類、結(jié)構(gòu)、接口、委托還有方法。泛型和非泛型的聲明方式差不多,只是它多了個類型參數(shù),例如下面的代碼

    class SomeClass<T> {        public T t;        //...    }
 1     //泛型接口 2     interface IFly<T> 3     { 4         void Fly(T input); 5     } 6  7     class SomeClass : IFly<int> 8     { 9         #region IFly<int> 成員10 11         public void Fly(int input)12         {13             Console.WriteLine(input);14         }15 16         #endregion17     }
   //泛型委托   delegate R OnSubmintHandle<T, R>(T value);   //還有我們常見的,無返回值委托 Action<>,有返回值委托Func<>
 1         static void Main(string[] args) 2         { 3             //我們可以用下面這兩個種方式調(diào)用泛型方法,因為編譯器可以通過方法參數(shù)推斷出類型參數(shù) 4             Display<int>(10); 5             Display(5); 6         } 7  8         static void Display<T>(T inpute) 9         {10             //對input的一些操作11             //.....12         }

泛型類型參數(shù)的約束

  泛型那么強大,那是不是所有的類型參數(shù)都能都能作為泛型的參數(shù)呢?

1         //比較兩個數(shù),返回中較小的一個2         static T Min<T>(T t1,T t2) where T:IComparable<T>3         {4             return t1.CompareTo(t2) > 0 ? t2 : t1;5         }

  在這段代碼中,大家可能注意到了where T:IComparable<T>,這是什么呢?為什么要加上這段代碼呢?當我去掉這段代碼后,visual 提示了錯誤

  由此可以看出來,并不是什么都可以作為泛型的類型參數(shù),除非你的泛型什么里面什么操作也沒有。那么如何對泛型的類型參數(shù)進行約束呢?這就用到了關(guān)鍵 where

    class SomleClass<T, U, R>        where T : class        where U : IComparable {        }

  約束類型表:

類名只有這個類型的類或從它繼承的類才能用作類型參數(shù)
class任何引用類型,包括類、數(shù)組、委托和接口都可以用作實參
struct任何值類都可以用作類型實參
接口只有這個接口或者實現(xiàn)了這個接口的類型才能用作實參
new()任何帶有無參構(gòu)造函數(shù)的類型都可以用作實參,構(gòu)造函數(shù)約束必須放在所有約束的最后一個

如果同時有多個約束,那么它們需要按一定的順序排列

    //約束的順序 [類、class、struct],[接口],[new()]    class SomleClass<T, U, R>        where T : class,IComparable,new()    {        }

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 民和| 梅河口市| 左权县| 海丰县| 徐闻县| 华安县| 翁源县| 新闻| 新晃| 岱山县| 自贡市| 西和县| 通化县| 广德县| 绩溪县| 霍林郭勒市| 乳山市| 日照市| 绥江县| 高要市| 洛川县| 上饶市| 澄城县| 山东省| 黄龙县| 赞皇县| 南阳市| 玉林市| 西贡区| 双鸭山市| 龙口市| 洛阳市| 云阳县| 保靖县| 旬邑县| 西乌珠穆沁旗| 兴文县| 维西| 东乌珠穆沁旗| 遵义县| 遵义县|