999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

對.NET平臺中泛型技術的探究

2010-09-21 11:30:44韓志強
赤峰學院學報·自然科學版 2010年11期
關鍵詞:方法

韓志強

(赤峰學院計算機科學與技術系,內蒙古赤峰024000)

對.NET平臺中泛型技術的探究

韓志強

(赤峰學院計算機科學與技術系,內蒙古赤峰024000)

隨著項目變得日益復雜,需要用一個更好的方式來重用和定制現有的軟件.為了促進代碼重用,尤其是算法的重用,在.NET 2.0以后支持一個名為泛型的特性.方法因為能獲得參數而強大.同理,泛型的主旨就是類會因為能獲取“類型”參數而變的強大.泛型類使用泛型類型,可以根據需要用特定的類型替換泛型類型,從而在保證了類型安全性的基礎上,同時提高了系統性能.泛型不僅限于類,而且還可用于委托、接口和方法等.由此,我們可以體會到泛型是一個強大的特性議.

.NET平臺;Object類;泛型;泛型約束

1 為什么引入泛型

若在.NET 2.0以前要創建一個靈活的類或方法,但該類或方法在編譯期間不知道使用什么類,就必須以object類為基礎,而object類在編譯期間沒有類型安全性,而且性能也會降低.在這里我們來分析一個沒使用泛型的類——System.Collections.Stack.它的作用是表示一個對象集合,使加入集合的最后一項作為從集合中獲取的第一項(即后進先出).我們在使用該類時,其收集的是object類型的變量.由于CLR中每個對象都是從object派生的,所以Stack無法驗證放在其中的元素是不是你希望的類型.除此之外,若從中獲取數據時,必須將返回值轉型為我們需要的類型,否則會引發異常.如果我們要使Stack類能支持多個數據類型時,假如不使用泛型,那么根本的問題在于他們必須使用一個通用的基類型,通常是object.因此上述提到的問題是不可避免,同時為使用object的類使用值類型時會使問題進一步惡化.

對此類問題最好的解決方案是——使用泛型.類似的情況還有很多,為了解決此類問題.NET平臺引入了泛型的概念.

2 泛型的內部機制

所謂泛型,即通過參數化類型來實現在同一份代碼上操作多種數據類型.利用“參數化類型”將類型抽象化,從而實現靈活的復用.由于C#語言是專門為.NET平臺量身定制的,因此為了更直觀的了解泛型技術,我們在下面以一段C#代碼為例,來對.NET的泛型技術進行分析說明,見表1.

在上面的程序中Test是一個泛型類.T是要實例化的泛型類型“參數”.如果T被實例化為int型,那么成員變量obj就是int型的;如果T被實例化為string型,那么obj就是string類型的.根據不同的類型,上面的程序顯示出不同的值.其編譯過程說明如下:

(1)第一輪編譯時,編譯器只為Test類型產生“泛型版”的IL代碼與元數據——并不進行泛型的實例化,T在中間只充當占位符.例如:Test類型元數據中顯示的

表1

(2)JIT編譯時,當JIT編譯器第一次遇到Test時,將用int替換“范型版”IL代碼與元數據中的T——進行泛型類型的實例化.例如:Main函數中顯示的

(3)CLR為所有類型參數為“引用類型”的泛型類型產生同一份代碼;但是如果類型參數為“值類型”,對每一個不同的“值類型”,CLR將為其產生一份獨立的代碼.因為實例化一個引用類型的泛型,它在內存中分配的大小是一樣的,但是當實例化一個值類型的時候,在內存中分配的大小是不一樣的.

3 泛型類型概述

3.1 泛型類

在聲明泛型類時,需要在一對<>中指定一個類型參數.例如:public class Stack{……}.然后泛型類的實例會收集與變量聲明對應的類型,而不需要將收集到的數據項轉換為object類型.在具體聲明一個變量和實例化之前,類型參數T只是一個占位符,等到具體聲明和實例化變量的時候,編譯器要求代碼指定類型參數.在程序代碼中我們可以看到,類型參數T可用于內部變量聲明,某方法的參數類型以及某方法的返回類型.

3.2 泛型接口和struct

現在.NET允許在C#語言的所有組成部分中使用泛型,其中包括泛型接口和struct.其聲明語法和類使用的語法完全相同.實現接口時,語法與非泛型類的語法是相同的.

對泛型接口的支持對于集合類來說尤其重要,使用泛型最多的地方就是集合類.假如沒有泛型,開發者就要依賴System.Collecttions命名空間中的一系列接口.和它們實現的類一樣,這些接口只能用于Object類型.因此這些接口要求進出這些集合類的所有訪問都執行一次轉型.相反,使用泛型接口,就可以避免執行轉型,因為參數化的接口能實現更強的編譯時綁定.

3.3 泛型委托

委托是類型安全的方法引用.通過泛型委托,委托的參數可以在以后定義.泛型委托提供了一種更靈活的方式來指定以類型安全的方式調用方法.其支持在委托返回值和參數上應用參數類型,這些參數類型同樣可以附帶合法的約束.

3.4 泛型方法

泛型方法是即使包容類不是泛型類,或者方法包含的類型參數不在泛型類的類型參數列表中,也依然使用泛型的方法.由此我們看出泛型方法既可以包含在泛型類型中,也可以包含在非泛型類型中..NET的泛型機制不支持在除方法外的其他成員(包括屬性、事件、索引器、構造器、析構器)的聲明上包含類型參數,但這些成員本身可以包含在泛型類型中,并使用泛型類型的類型參數.

4 泛型約束

泛型允許為類型參數定義約束.這些約束強迫類型遵守各種規則..NET泛型要求對“所有泛型類型或泛型方法的類型參數”的任何假定,都要基于“顯式的約束”,以維護.NET所要求的類型安全.“顯式約束”并非必須,但是如果沒有指定“顯式約束”,編譯器會認為類型參數只有從基類型Object繼承的成員,因為Object是所有類型的終極基類,因此泛型類型參數將只能訪問System.Object類型中的公有方法.

.NET中允許你為泛型類中的每個類型參數提供一個可選的約束列表,約束聲明了泛型要求的類型參數的特征,為了聲明一個約束,需要使用where關鍵字,后跟一對“參數:要求”.其中,“參數”必須是泛型類型中定義的一個參數,而“要求”用于限制類型從中派生的類或接口,或者限制必須存在一個默認的構造器,或者限制使用一個值類型/引用類型約束.

5.NET泛型與Java泛型的對比

Sun完全是在編譯器中為Java實現泛型,而不是在JVM(Java虛擬機)中.Sun這樣做的目的是為了防止因為使用了泛型而需要分發新的JVM.Java的實現使用了與C++中的“模板”和C#中的“泛型”相似的語法,其中包括類型參數和約束,但是由于它不區分對待值類型和引用類型,所以未修改的JVM不能為值類型支持泛型.所以Java中的泛型不具有C#那樣的執行效率.Java編譯器需要返回數據的時候,都會插入來自指定約束的自動向下轉型(如果聲明了這樣的一個轉型的話),或者插入基本object類型(如果沒有聲明的話).除此之外,Java編譯器在編譯時生成一個具體化的類型,它隨即用于實例化任何已構造的類型.最后由于JVM沒有提供對泛型的原生支持,所以在執行時無法確定一個泛型類型實例的類型參數,“反射”的其他應用也受到了嚴格的限制.

6 結束語

.NET中的的泛型能力由CLR在運行時支持,它既不同于C++在編譯時所支持的靜態模板,也不同于Java在編譯器層面使用“擦拭法”支持的簡單的泛型,因此.NET的泛型即避免了C++靜態模板可能導致的代碼膨脹的問題,又提高了執行效率.同時.NET的泛型類型也攜帶有豐富的元數據,因此.NET的泛型類型可以應用于強大的反射技術.

總之,泛型顯著改變了原有的編程風格.凡是以前使用了object類的地方,現在最好使用泛型來代替.換言之,凡是出現了object類的地方,都應該考慮泛型.泛型安全性的提升、轉型的避免以及代碼量的減少為泛型賦予了無窮的魅力.同理,凡是使用了System.Collections命名空間的地方,System.Collections.Generics都是一個更好的選擇.

TP31

A

1673-260X(2010)11-0023-02

猜你喜歡
方法
中醫特有的急救方法
中老年保健(2021年9期)2021-08-24 03:52:04
高中數學教學改革的方法
河北畫報(2021年2期)2021-05-25 02:07:46
化學反應多變幻 “虛擬”方法幫大忙
變快的方法
兒童繪本(2020年5期)2020-04-07 17:46:30
學習方法
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
最有效的簡單方法
山東青年(2016年1期)2016-02-28 14:25:23
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 免费人成视网站在线不卡| 亚洲综合经典在线一区二区| 国产精品色婷婷在线观看| 一级看片免费视频| 国产在线视频二区| 国产美女主播一级成人毛片| 91破解版在线亚洲| 久久久精品国产SM调教网站| 无码免费试看| 欧美特级AAAAAA视频免费观看| 色窝窝免费一区二区三区| 精品少妇人妻一区二区| 国产91视频免费观看| 中文无码伦av中文字幕| 国产91精品调教在线播放| a级毛片免费看| 露脸国产精品自产在线播| 亚洲区第一页| 国产日韩欧美精品区性色| 亚洲水蜜桃久久综合网站| 久久精品国产精品一区二区| 国产精品视频导航| 最新国产网站| a毛片在线播放| 久久99国产综合精品1| 成人国产精品一级毛片天堂 | 91日本在线观看亚洲精品| 91九色国产porny| 最新国产精品鲁鲁免费视频| 黄色污网站在线观看| 伊人成人在线| 国产精品污污在线观看网站| 97精品国产高清久久久久蜜芽| 国产精品99久久久久久董美香| 国产视频入口| 亚洲精品无码日韩国产不卡| 国产xx在线观看| 亚洲愉拍一区二区精品| 久热re国产手机在线观看| 国产日韩精品欧美一区灰| 欧美自慰一级看片免费| 精品自拍视频在线观看| 久草国产在线观看| 97一区二区在线播放| 国产剧情国内精品原创| 久久精品无码专区免费| 欧美一区二区三区国产精品| 亚洲精品午夜天堂网页| 91亚洲免费视频| 国产精品一区二区国产主播| 精品国产福利在线| 国产18在线播放| 国产又黄又硬又粗| AV无码国产在线看岛国岛| 国产精品yjizz视频网一二区| 日韩成人午夜| www欧美在线观看| 国产成人高精品免费视频| 日韩精品免费一线在线观看| 久草视频精品| 凹凸国产分类在线观看| 五月婷婷激情四射| 久久香蕉国产线看观看精品蕉| 亚洲天堂视频网站| 美女无遮挡被啪啪到高潮免费| 人人妻人人澡人人爽欧美一区| 国产69精品久久久久妇女| 99精品视频九九精品| 五月婷婷亚洲综合| 97国产精品视频自在拍| 性欧美精品xxxx| 日本91视频| 91精品啪在线观看国产| 国产乱子伦视频在线播放| 亚洲天堂久久| 国产丝袜精品| 99视频有精品视频免费观看| 9啪在线视频| 国产精品亚洲αv天堂无码| 91精品国产91久久久久久三级| 国产精品成人AⅤ在线一二三四 | 1769国产精品免费视频|