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

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

06.C#泛型約束和高級(jí)泛型(三章3.3-3.4)

2019-11-17 02:40:50
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

06.C#泛型約束和高級(jí)泛型(三章3.3-3.4)

  吃午飯前繼上篇泛型再寫一篇關(guān)于泛型的文章,雖然總是被博客園移出首頁(yè),文章不精確實(shí)是大問(wèn)題啊,會(huì)再接再厲的。進(jìn)入正題。

  先來(lái)說(shuō)下泛型約束。當(dāng)我們?cè)谑褂梅盒偷臅r(shí)候通常會(huì)希望使用泛型實(shí)參時(shí),參數(shù)能具備某一些特性,這時(shí)"泛型約束"來(lái)了,它能幫助我們?cè)趥魅敕盒蛥?shù),該參數(shù)要實(shí)現(xiàn)先前指定的約束。有4種約束可用,如下:

  1. 引用類型約束:確保使用的類型參數(shù)是引用類型(T:class,且必須是類型參數(shù)指定的第一個(gè)約束),類型實(shí)參任何類、接口、數(shù)組、委托、或者已知是引用類型的另一個(gè)類型參數(shù)。
  2. 值類型約束:表示成(T:struct),可以確保使用的實(shí)參是值類型,包括枚舉(enums),但是它將可空類型排隊(duì)在外。
  3. 構(gòu)造類型約束:表示成(T:new()),必須是約束的最后一個(gè)約束,它檢查類型是否具有一個(gè)可用于創(chuàng)建實(shí)例的無(wú)參構(gòu)造函數(shù)。
  4. 轉(zhuǎn)換類型約束:允許你指定另一個(gè)類型,類型參數(shù)可以通過(guò)一致性引用或隱式轉(zhuǎn)換或裝箱轉(zhuǎn)換轉(zhuǎn)換為該類型。
1 public struct DoDo<T> where T : class2 {}3 public class BiBi<T> where T : struct4 {}5 public struct CoCo<T> where T : new()6 {}7 public struct DkDk<T> where T : System.Data.IDbConnection8 {}

  上述四個(gè)分別對(duì)應(yīng)四種類型約束(僅僅在單個(gè)使用),下面來(lái)說(shuō)下在組合使用的情況。

  組合使用有兩點(diǎn)要注意:

  1. 如果存在多個(gè)輪換類型約束,并且其中一個(gè)是類,那么它應(yīng)該出現(xiàn)在接口的前面,不能多次指定同一個(gè)接口。
  2. 當(dāng)包含多個(gè)類型參數(shù)時(shí),每一個(gè)類型約束都單獨(dú)使用一個(gè)where。
 1 //不能同時(shí)指定類型參數(shù)既是引用類型又是值類型 2 //public struct DoDo<T> where T : class, struct 3 //{} 4  5 public class BiBi<T> where T : Stream, new() 6 {} 7  8 //使用構(gòu)造類型約束,new()要放在最后 9 //public class LiLi<T> where T : new(), Stream10 //{}11 12 public struct CoCo<T> where T : class, IDisposable , new()13 {}14 15 //如下一個(gè)約束是類,要放在接口的前面16 //public struct FeFe<T> where T : IDisposable, class, new()17 //{}

  使用泛型約束知識(shí)都在上面了,更多的去理解和消化。在使用泛型方法時(shí),讓編譯器是推斷能讓我們的代碼更簡(jiǎn)短,但可讀性可能不高。

  ------------------------------------------------------------------------------------------------------------------------------------------

  Point 1 關(guān)于靜態(tài)字段和靜態(tài)構(gòu)造方法,每一個(gè)封閉類型有一個(gè)靜態(tài)字段,如果有的話

1 StaticConstraint<int> intStatic = new StaticConstraint<int>();2 StaticConstraint<int>.StaticValue = "int";3 4 StaticConstraint<double> doubleStatic = new StaticConstraint<double>();5 StaticConstraint<double>.StaticValue = "double";6 7 StaticConstraint<char> charStatic = new StaticConstraint<char>();8 StaticConstraint<char>.StaticValue = "char";

  Point 2 使用typeof獲取類型

  typeof可通過(guò)兩種方式作用于泛型類型,一種用來(lái)獲取未綁定泛型類型,一種用來(lái)獲取特定的已構(gòu)造類型。前一種需要提供泛型的名稱,去除所有類型參數(shù)的名稱,但要保留逗號(hào),后一種需要采取與聲明泛型類型變量相同的方式指定類型參數(shù)即可。

  

 1 static void GetTypeOfConstraint<X>() 2 { 3         //獲取未綁定泛型類型 4         Console.WriteLine(typeof(X)); 5         Console.WriteLine(typeof(List<>)); 6         Console.WriteLine(typeof(Dictionary<,>)); 7  8         //獲取已構(gòu)造類型 9         Console.WriteLine(typeof(List<int>));10         Console.WriteLine(typeof(Dictionary<int, double>));11 }

  請(qǐng)斧正。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 四会市| 英德市| 兰坪| 梨树县| 佛冈县| 通河县| 峨山| 临泽县| 兴城市| 法库县| 潼关县| 易门县| 松桃| 溧水县| 梁河县| 延寿县| 清徐县| 邯郸市| 清镇市| 武义县| 手游| 清河县| 松原市| 兰考县| 扬中市| 瑞丽市| 勐海县| 沧源| 普安县| 东阿县| 桃园县| 弥渡县| 英吉沙县| 岑巩县| 望谟县| 师宗县| 恩平市| 静乐县| 清原| 新竹县| 盈江县|