自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

不得不提的C#2.0泛型約束

開發(fā) 后端
泛型約束的引入讓程序員在操作C#類型時更加的規(guī)范和準(zhǔn)確,為了提供強(qiáng)編譯時檢查和減少類型轉(zhuǎn)換,C#2.0泛型引入了約束(Constraints)這個概念,這是一個泛型的可選項(xiàng)。

C#泛型是.NET中最常見的一種特性,接下來我們就來了解關(guān)于C#泛型的一些特性,看一下代碼:

  1. public class Dictionary<K,V> 
  2. {  
  3.     public void Add(K key, V value)  
  4.     {  
  5.           
  6.         if (key.CompareTo(x) < 0) {}   // Error, no CompareTo method  
  7.           
  8.     }  

由于K可以任何類型,所以可想而知,key只能使用Object中定義的ToString等方法。代碼在編譯時就出錯了,因?yàn)閗ey可能不含有CompareTo方法。那么如何解決呢?一種容易想到的辦法就是把key轉(zhuǎn)換成IComparable,那么代碼就變成了這樣:

  1. public class Dictionary<K,V> 
  2. {  
  3.     public void Add(K key, V value)  
  4.     {  
  5.           
  6.         if (((IComparable)key).CompareTo(x) < 0) {}  
  7.           
  8.     }  

這次沒有編譯時錯誤了。但是還是要小心,因?yàn)閷?shí)際使用時,如果你使用了一個沒有實(shí)現(xiàn)IComparable的類型作參數(shù),就會出現(xiàn)InvalidCastException異常。為了提供強(qiáng)編譯時檢查和減少類型轉(zhuǎn)換,C#2.0泛型引入了約束(Constraints)這個概念,這是一個泛型的可選項(xiàng)。語法是使用where關(guān)鍵字指明約束的類型參數(shù),然后加冒號,再加上類,接口,類型參數(shù)等。我們把代碼變成了這樣:

  1. public class Dictionary<K,V> where K: IComparable  
  2. {  
  3.     public void Add(K key, V value)  
  4.     {  
  5.           
  6.         if (key.CompareTo(x) < 0) {}  
  7.           
  8.     }  

這樣就保證了任何為K類型參數(shù)提供的類型都實(shí)現(xiàn)了IComparable接口。所以我們的key就可以使用CompareTo方法了。如果我們在使用時提供了沒有實(shí)現(xiàn)IComparable接口的類型,就會出現(xiàn)編譯時錯誤,我們的約束可以不止是一個接口,可以是多個,還可以是跟類或其他約束混合,請看下面代碼:

  1. public class EntityTable<K,E> 
  2.     where K: IComparable<K>, IPersistable  
  3.     where E: Entity, new()  
  4. {  
  5.     public void Add(K key, E entity)  
  6.     {  
  7.           
  8.         if (key.CompareTo(x) < 0) {}  
  9.           
  10.     }  

對于約束new()可能不好理解。其實(shí)這個約束保證了提供給類型參數(shù)E的類型必須有一個public,無參的構(gòu)造器。這樣它就允許泛型類使用new E()創(chuàng)建這個類型的實(shí)例。另外指出的是,雖然可以有多個接口作約束,但至多只能有一個類。

類型參數(shù)必須小心地使用。雖然它提供了更強(qiáng)編譯時類型檢查,但是卻也約束了泛型類型的一些可能的使用情況。比如說,有一個泛型類List<T>約束T實(shí)現(xiàn)IComparable接口,這樣就可以在List<T>的Sort方法中比較項(xiàng)了。然而,就不能為那些沒有實(shí)現(xiàn)IComparable的類使用IList<T>了,就算Sort方法實(shí)際上并沒有調(diào)用。

本文轉(zhuǎn)載自小新的技術(shù)天地的博客,

原文地址:http://wdxinren.cnblogs.com/archive/2005/05/29/164392.html

【編輯推薦】

  1. 詳解如何設(shè)置Linux下的C#開發(fā)環(huán)境
  2. 淺析C#與C++在靜態(tài)構(gòu)造函數(shù)上的異同
  3. 詳解C#中相等運(yùn)算符重載可能造成的陷阱
  4. 增強(qiáng)的XML?通過C# 4.0 dynamic享受Ruby寫法之探討
  5. 詳解C#泛型特性及相關(guān)實(shí)例
責(zé)任編輯:王曉東 來源: 博客園
相關(guān)推薦

2016-09-27 23:47:42

2016-12-06 16:24:36

微軟量子計(jì)算

2009-11-11 16:48:29

Visual C++

2017-11-21 09:01:59

Java編程技術(shù)

2010-11-02 14:51:11

職場

2024-03-20 17:16:09

人形機(jī)器人黃仁勛3D

2009-08-24 13:31:38

C# 泛型約束

2019-10-18 17:55:03

安全運(yùn)營

2019-12-24 14:04:59

PythonExcel數(shù)據(jù)處理

2021-04-12 08:56:00

多線程Future模式

2020-07-09 12:50:29

JVM內(nèi)存管理Java

2010-05-26 15:58:52

MySQL遠(yuǎn)程連接

2020-06-15 08:19:00

ZooKeeperEureka

2019-11-14 15:38:46

AndroidRelease項(xiàng)目

2011-03-31 10:46:54

LinuxCLI軟件

2009-08-24 13:41:23

C# 泛型約束

2010-05-10 13:01:03

OracleDBA面試

2010-05-21 09:40:57

MySQL出錯代碼列表

2010-05-25 09:58:43

MySQL數(shù)據(jù)庫

2011-09-23 09:24:26

豆瓣電臺應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號