




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、在.NET中,繼承按照其分類方式不同,一般分類如下:實(shí)現(xiàn)繼承:派生類繼承了積累的所有屬性和方法,并且只能有一個(gè)積累,在.NET中System.Object是所有類型的最終基類,這種繼承方式稱為實(shí)現(xiàn)繼承。接口繼承:派生類繼承了接口的方法簽名。不同于實(shí)現(xiàn)繼承的是,接口繼承允許多繼承,同時(shí)派生類只繼承了方法簽名而沒有方法實(shí)現(xiàn),具體的實(shí)現(xiàn)必須在派生類中完成。因此,確切的說,這種繼承方法應(yīng)該稱為接口實(shí)現(xiàn)。繼承本質(zhì)的認(rèn)識(shí)繼承是可傳遞的,子類是對(duì)父類的擴(kuò)展,必須繼承父類的方法,同時(shí)可以添加新方法。子類可以調(diào)用父類方法和字段,而父類不能調(diào)用子類的方法和字段。虛方法如果實(shí)現(xiàn)覆寫操作,使得父類指針可以指向子類對(duì)象
2、成員。子類不光繼承弗雷德公有成員,同時(shí)繼承了父類的私有成員,只是在子類中不被訪問。New關(guān)鍵字在虛方法繼承中的阻斷作用。關(guān)注對(duì)象原則:調(diào)用子類還是父類的方法,取決于創(chuàng)建的對(duì)象是子類對(duì)象還是父類對(duì)象,而不是它的引用類型。例如Bird bird2=new Chicken()時(shí),我們關(guān)注的是其創(chuàng)建對(duì)象為Chicken類型,因此子類將繼承父類的字段和方法,或者覆寫父類的方法,而不是關(guān)注bird2的引用類型是否為Bird。引用類型的區(qū)別決定了不同的對(duì)象在方法中的不同的訪問權(quán)限Bird bird=new Chicken();Chicken chicken=new Chicken();Bird對(duì)象和chic
3、ken對(duì)象在內(nèi)存布局上是一樣的,差別在于引用指針的類型不同,前者是Bird指針類型后者是Chicken指針類型 執(zhí)行就近原則:對(duì)于同名字段或方法,編譯器是按照其順序查找來引用的,也就是訪問離它創(chuàng)建最近的字段或方法。這是父類排在子類前,先于子類編譯的原因。抽象類繼承與接口繼承在規(guī)則上的歸納抽象類適合于有族層概念的關(guān)系,而接口最適合不同類提供通用功能。接口著重于CAN-DO關(guān)系類型,而抽象類則偏重于IS-A是關(guān)系。接口多定義對(duì)象的行為;抽象類多定義對(duì)象的屬性。如果預(yù)計(jì)會(huì)出現(xiàn)版本問題,可以創(chuàng)建抽象類因?yàn)橹殿愋褪敲芊獾?,所以只能?shí)現(xiàn)接口,而不能繼承類。繼承之毒瘤主要體現(xiàn)在:繼承可能造成子類的無限膨脹,
4、不利于類體系的安全和維護(hù)繼承的子類對(duì)象確定于編譯期,無法滿足需要運(yùn)行期才確定的情況,而類聚合很好地解決了這一問題隨著繼承層次的復(fù)雜化或者子類的多樣化,不可避免的灰出現(xiàn)對(duì)父類的無效繼承或者有害繼承。子類部分的繼承父類的方法或者屬性,更能適應(yīng)實(shí)際的設(shè)計(jì)需求面向?qū)ο蟮幕驹瓌t:多聚合,少繼承,低耦合,高內(nèi)聚Adapter模式就其實(shí)現(xiàn)方式主要包括:類的Adapter模式。通過引入新的類型來繼承原有類型,同時(shí)實(shí)現(xiàn)新加入的接口方法。其缺點(diǎn)就是耦合度高,需要引入過多的新類型對(duì)象的Adapter模式。通過聚合而非繼承的方式來實(shí)現(xiàn)對(duì)原有系統(tǒng)的擴(kuò)展,松散耦合,較少的新類型繼承中重點(diǎn)內(nèi)容重點(diǎn)規(guī)則:密封類不可以被繼承
5、繼承關(guān)系中,我們跟多的是關(guān)注其共性而不是其特性,因?yàn)楣残允菍哟螐?fù)用的基礎(chǔ),而特性是系統(tǒng)擴(kuò)展實(shí)現(xiàn)單繼承,接口多繼承從宏觀來看,繼承多關(guān)注與共通性,而多態(tài)則著眼于差異性繼承的層次應(yīng)該有所控制,否則類型之間的關(guān)系維護(hù)會(huì)消耗更多精力面向?qū)ο笤瓌t:多組合,少繼承,低耦合,高內(nèi)聚只讀字段在構(gòu)造函數(shù)中被賦值屬性的實(shí)質(zhì)是在編譯時(shí)分別將get和set訪問器實(shí)現(xiàn)對(duì)外方法,從而達(dá)到控制屬性目的而對(duì)屬性的讀寫伴隨的實(shí)際是一個(gè)相應(yīng)方法的調(diào)用,它以一種簡(jiǎn)單的方式實(shí)現(xiàn)了方法。get負(fù)責(zé)可讀屬性,set負(fù)責(zé)可寫屬性封裝規(guī)則:盡可能的調(diào)用類的訪問器,而不是成員,即使在類的內(nèi)部?jī)?nèi)部私有部分可任意更改,但一定要在保證外部接口穩(wěn)定的
6、前提下將對(duì)字段的讀寫控制實(shí)現(xiàn)為屬性,而不是方法,否則舍近求遠(yuǎn),非明智之選類封裝是由設(shè)置訪問權(quán)限來實(shí)現(xiàn)的,對(duì)內(nèi)實(shí)現(xiàn)為private,對(duì)外實(shí)現(xiàn)為public。還要對(duì)protected,internal有較深的理解基類繼承式多態(tài):Flies myFile=new WORDFile();myFile.Open();/WORDFile為Files的子類接口實(shí)現(xiàn)式多態(tài):IFliesOpen myFile=new WORDFile();myFile.Open();/IFliesOpen為接口通常將子類中共有的但卻容易變化的特征抽取為虛函數(shù)在父類中定義,而在子類中通過覆寫來實(shí)現(xiàn)操作多態(tài)的規(guī)則和意義:多態(tài)提供了
7、對(duì)同一類對(duì)象的差異化處理方式,實(shí)現(xiàn)了對(duì)變化和共性的有效封裝和繼承,體現(xiàn)了“一個(gè)接口,多種方法的”的思想,是方法抽象機(jī)制成為可能在.NET中,默認(rèn)情況下方法是非虛的,以C#為例必須顯式的通過virtual和abstract標(biāo)記為虛方法或者抽象方法,以便在子類中覆寫父類方法在面向?qū)ο蟮幕疽刂?,多態(tài)和繼承、多態(tài)和重載存在緊密的聯(lián)系,多態(tài)的基礎(chǔ)就是建立有效的繼承體系,一次繼承和重載是多態(tài)的實(shí)現(xiàn)基礎(chǔ)接口規(guī)則:接口隔離原則強(qiáng)調(diào)接口應(yīng)該被實(shí)現(xiàn)為單一功能的小接口,而不要實(shí)現(xiàn)為具有多個(gè)功能的胖接口,類對(duì)于類的依賴應(yīng)建立在最小的接口之上接口支持多繼承,既可以作用于值類型,也可以作用于引用類型禁止為已發(fā)布的接口
8、添加新的成員,這意味著你必須重新修改所有實(shí)現(xiàn)了該接口的類型,在實(shí)際應(yīng)用中,這往往是不可的事情接口不能被實(shí)例化,沒有構(gòu)造函數(shù),接口的成員被隱式聲明為public單一職責(zé)原則核心思想:一個(gè)類,最好只做一件事情,只有一個(gè)能引起它變化的原因單一職責(zé)原則建議:一個(gè)類只有一個(gè)引起它變的原因,否則就應(yīng)考慮重構(gòu)SRP(單一職責(zé)原則)又引起變化的原因決定,而不由功能職責(zé)決定。雖然職責(zé)常常是引起變化設(shè)為軸線,但有時(shí)未必測(cè)試驅(qū)動(dòng)開發(fā),有助于實(shí)現(xiàn)合理分離功能的設(shè)計(jì)可以通過Facade模式或Proxy模式進(jìn)行職責(zé)分離開放封閉原則核心思想:軟件實(shí)體應(yīng)該是可擴(kuò)展的,而不可修改的。也就是說,對(duì)擴(kuò)展時(shí)開放的,而對(duì)修改是封閉的開
9、放封閉原則建議:開放封閉原則是最重要的設(shè)計(jì)原則,Liskov替換原則和合成/聚合復(fù)用原則為開放封閉原則的實(shí)現(xiàn)提供保證可以通過Template Method模式和Strategy模式驚喜重構(gòu),實(shí)現(xiàn)對(duì)修改封閉、對(duì)擴(kuò)展開放的設(shè)計(jì)思路封裝變化,是實(shí)現(xiàn)開放封閉原則的重要手段,對(duì)于經(jīng)常發(fā)生變化的狀態(tài)一般將其封裝為一個(gè)抽象,例如銀行業(yè)務(wù)中的IBankProcess接口拒絕濫用抽象,只講經(jīng)常變化的部分進(jìn)行抽象,這種經(jīng)驗(yàn)可以從設(shè)計(jì)模式的學(xué)習(xí)與應(yīng)用中獲得依賴倒置原則核心思想:依賴于抽象高層模塊不應(yīng)該依賴于底層模塊,二者都應(yīng)該依賴于抽象抽象不應(yīng)該依賴于具體,集體應(yīng)該依賴于抽象依賴倒置原則建議:抽象的穩(wěn)定性決定了系統(tǒng)
10、的穩(wěn)定性,因?yàn)槌橄笫潜3植蛔兊?,依賴于抽象是面向?qū)ο笤O(shè)計(jì)的精髓,也是依賴倒置原則的核心思想依賴于抽象是一個(gè)通用規(guī)則,而某些時(shí)候依賴于于細(xì)節(jié)則是在所難免的,必須權(quán)衡再抽向和具體之間的取舍,方法是一成不變的依賴于抽閑,就是要對(duì)接口編程,不要對(duì)實(shí)現(xiàn)編程接口隔離原則核心思想:使用多個(gè)小的專門的接口,而不是使用一個(gè)大的總接口接口英愛是內(nèi)聚的,應(yīng)該避免出現(xiàn)“胖”接口一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小的接口上,不要強(qiáng)迫依賴不用的方法,這是一種接口污染分離的主要手段:委托分離,通過增加一個(gè)新的類型來委托客戶的請(qǐng)求,隔離客戶接口的未知依賴,但是會(huì)增加系統(tǒng)開銷多重繼承分離,通過接口多繼承來實(shí)現(xiàn)客戶需求,這種方式
11、值得推薦接口隔離原則建議:功能先進(jìn)的接口合并,可能造成污染,實(shí)現(xiàn)內(nèi)聚的接口才是接口設(shè)計(jì)的基本原則接口隔離原則,能夠保證系統(tǒng)擴(kuò)展和修改的硬性不會(huì)擴(kuò)張到系統(tǒng)的其他部分,一定程度上保證了對(duì)開放封閉原則的遵守Liskov替換原則核心思想:子類必須能夠替換基類Liskov替換原則實(shí)現(xiàn)方法:將公共部分抽象為基類的接口或抽象類,通過Extract Abstract Class,在子類中通過覆寫父類的方法實(shí)現(xiàn)以新的方式支持同樣職責(zé)Liskov替換原則建議:Liskov替換原則是關(guān)于繼承機(jī)制的設(shè)計(jì)原則,違反了Liskov原則就必然導(dǎo)致違反開放封閉原則Liskov替換緩則能夠保證系統(tǒng)具有良好的擴(kuò)展性,同時(shí)實(shí)現(xiàn)基于
12、多態(tài)的抽象機(jī)制,能夠見少代碼冗余,避免運(yùn)行期的類型判別子類必須滿足基類和客戶端對(duì)其的行為約定,客戶端對(duì)行為的期望在基類和子類必須保持一致IS-A是基于行為凡是的,它依賴于客戶端的調(diào)用方式,對(duì)象的行為方式才是值得關(guān)注的要素子類的一場(chǎng)必須控制在父類可預(yù)計(jì)的范圍,否則將導(dǎo)致替換違規(guī),違反了Liskov替換原則軟件開發(fā)原則:面向抽象編程高耦合,低內(nèi)聚封裝變化實(shí)現(xiàn)重用:代碼重用、算法重用為了達(dá)到高耦合低內(nèi)聚目標(biāo):盡可能實(shí)現(xiàn)單項(xiàng)依賴不需要進(jìn)行數(shù)據(jù)交換的雙方,不喲啊實(shí)現(xiàn)多此一舉的關(guān)聯(lián)保持內(nèi)部的封裝性,關(guān)聯(lián)的雙方不要深入實(shí)現(xiàn)細(xì)節(jié)通信程序中的所有依賴關(guān)系都應(yīng)終止于抽象類或接口依賴倒置設(shè)計(jì)要求:少繼承,多聚合單向
13、依賴封裝抽象對(duì)依賴關(guān)系都應(yīng)終止于抽象類或接口任何變量都不應(yīng)該持有一個(gè)指向據(jù)提類的指針或者引用任何類都不應(yīng)該從具體類派生任何方法都不應(yīng)該覆寫它的任何基類中已經(jīng)實(shí)現(xiàn)的方法系統(tǒng)架構(gòu)應(yīng)該有清晰的層次定義,層次之間接口箱外提供內(nèi)聚服務(wù),正如在三層架構(gòu)中的示例一樣典型的以new進(jìn)行的對(duì)象創(chuàng)建操作,是對(duì)依賴倒置原則的典型違反,而通過依賴注入進(jìn)行對(duì)象的創(chuàng)建解耦是常用的解決之道對(duì)抽象編程,需要增加必要的類和輔助代碼進(jìn)行支持, 某種程度上增加了系統(tǒng)的復(fù)雜度和維護(hù)成本當(dāng)具體類不在變化時(shí),遵守依賴倒置式多此一舉模式的起點(diǎn)工廠方法(Factory Method Pattern)模式起點(diǎn):將程序中創(chuàng)建對(duì)象的操作進(jìn)行單獨(dú)地
14、處理,大大提高了系統(tǒng)擴(kuò)展的柔性,接口的抽象化處理給相互依賴的對(duì)象創(chuàng)建提供了最好的抽象模式典型應(yīng)用:工廠方法模式是最簡(jiǎn)單也最容易理解的模式之一。其關(guān)注的核心是對(duì)于創(chuàng)建對(duì)象這件事的分離單例(Singleton Pattern)模式起點(diǎn):一個(gè)類只有一個(gè)實(shí)例,且提供一個(gè)訪問全局點(diǎn)的方式,更加靈活的保證了實(shí)例的粗行間和訪問約束,并且唯一約束的實(shí)施由類本身實(shí)現(xiàn)典型應(yīng)用:一個(gè)類只有一個(gè)實(shí)例,經(jīng)常被用于Façade模式,稱為單例外觀命令(Command Pattern)模式起點(diǎn):將請(qǐng)求封裝為對(duì)象,從而將命令的執(zhí)行責(zé)任分開。通常在列隊(duì)中等待命令,這和現(xiàn)實(shí)多么相似啊。如果你喜歡發(fā)號(hào)施令,請(qǐng)考慮IComm
15、and典型應(yīng)用:菜單系統(tǒng)策略(Stategy Pattern)模式起點(diǎn):策略模式,將易于變化的部分封裝為接口,通常Stategy封裝一些運(yùn)算法則,使之能相互交換典型應(yīng)用:數(shù)據(jù)層??紤]以策略提供算法和數(shù)據(jù)的分離迭代器(Iterator Pattern)模式起點(diǎn):相信任何的系統(tǒng)中,都會(huì)用到數(shù)組、集合、鏈表、隊(duì)列這樣的類型吧,那你就不得不關(guān)心迭代模式的來龍去脈。在遍歷算法中,迭代模式提供了遍歷的順序訪問容器,GOF給出的定義為:提供一種方法訪問容器(Container)對(duì)象中各個(gè)元素,而又無需暴露該對(duì)象的內(nèi)部細(xì)節(jié)典型應(yīng)用:.NET中就是應(yīng)用率迭代器來創(chuàng)建用于foreach的集合模板方法(Templa
16、te Method Pattern)模式起點(diǎn):顧名思義,模板方法就是在副類中定義模板,然后又子類實(shí)現(xiàn)。具體的實(shí)現(xiàn)一般由父類定義算法的骨架,然后將算法的某些步驟委托給子類典型應(yīng)用:ASP.NET的Page類觀察者(Observer Pattern)模式起點(diǎn):定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。觀察者和被觀察者的分開,為模塊劃分提供了清晰的界限典型應(yīng)用:在.NET中使用委托和事件可以更好地實(shí)現(xiàn)觀察者模式,事件的注冊(cè)和撤銷不就對(duì)應(yīng)著觀察者對(duì)其對(duì)象的觀察嗎?職責(zé)鏈(Chain of Responsibility Pattern)模式起
17、點(diǎn):將操作組成一個(gè)鏈表,通過遍歷操作鏈表找到合適的處理器。通過統(tǒng)一的接口,被多個(gè)處理器實(shí)現(xiàn),每個(gè)處理器都有后繼處理器,可以將請(qǐng)求沿著處理器傳遞典型應(yīng)用:GUI系統(tǒng)的事件傳播橋接(Bridge Pattern)模式起點(diǎn):把實(shí)現(xiàn)和邏輯分開,對(duì)于我們深刻理解面向?qū)ο缶酆蠌?fù)用的思想甚至有助益典型應(yīng)用:多版本.NET Framework通過環(huán)境變量與對(duì)應(yīng)版本應(yīng)用建立橋梁代理(Proxy Pattern)模式起點(diǎn):將負(fù)載的邏輯封裝起來,將代理對(duì)象控制實(shí)際對(duì)象的創(chuàng)建和訪問,由代理對(duì)象屏蔽原有邏輯的復(fù)雜性典型應(yīng)用:WCF服務(wù)代理裝飾器(Decorator Pattern)模式起點(diǎn):為原有系統(tǒng),動(dòng)態(tài)的增加或者刪
18、除狀態(tài)和行為,在繼承被裝飾類的同時(shí)包含被類裝飾的實(shí)例成員典型應(yīng)用:.NET中的Stream設(shè)計(jì)門面(Façade Pattern)模式起點(diǎn):將表現(xiàn)層和邏輯層隔離,封裝底層的復(fù)雜處理,為用戶提供簡(jiǎn)單的接口,這樣的例子隨處可見。門面模式很多時(shí)候是一種系統(tǒng)架構(gòu)設(shè)計(jì),在很多項(xiàng)目中,都實(shí)現(xiàn)了門面模式的接口,為復(fù)雜系統(tǒng)的解耦提供了最好的解決方案典型應(yīng)用:WSDL就是一個(gè)典型平臺(tái)無關(guān)的門面應(yīng)用組合(Composite Pattern)模式起點(diǎn):不管是個(gè)體還是組件,都包含公共的操作接口,通過同樣的方式來處理一個(gè)組合中的所有對(duì)象。組件的典型操作包括:增加、刪除、查找、分組和獲取子元素等典型應(yīng)用:樹形結(jié)
19、構(gòu)的的數(shù)據(jù)組織適配器(Adapter Pattern)模式起點(diǎn):在原類型不做任何改變的情況下,擴(kuò)展新的接口,靈活且多樣的適配一起舊俗。這種打破舊框框、適配新格局的思想,低是面向?qū)ο蟮木?。以繼承方式實(shí)現(xiàn)類的Adapter模式和以聚合方式實(shí)現(xiàn)對(duì)象的Adapter模式,各有千秋。看來把他們叫做包裝器一點(diǎn)也不為過典型應(yīng)用:RCW(Runtime Callable Wrapper)在COM Iterop中的應(yīng)用模式建議:不要拿著GOF的書從頭看到尾,對(duì)我們來說那是圣經(jīng)也是字典,系統(tǒng)的學(xué)習(xí)其實(shí)意義不大軟件設(shè)計(jì)中體會(huì)設(shè)計(jì)模式,設(shè)計(jì)就是不斷有需求生成的重構(gòu)結(jié)合.NET Framework框架來學(xué)習(xí)設(shè)計(jì)模式在
20、.NET中的應(yīng)用,對(duì)了解設(shè)計(jì)模式來說是一舉兩得的是,既體味了設(shè)計(jì),又深諳了框架重構(gòu)、不斷地重構(gòu)切勿因模式而模式,任何的模式套用都意味著實(shí)現(xiàn)的復(fù)雜升級(jí)和執(zhí)行的性能損耗面向?qū)ο笈c基于對(duì)象二者概念主要體現(xiàn)在:繼承是區(qū)別面向?qū)ο笈c基于對(duì)象的核心所在,對(duì)于少了繼承性的基于對(duì)象來說,自然就的好了多態(tài)性支持封裝是面向?qū)ο笈c基于兌現(xiàn)的共同特征閉包的非必要條件:嵌套定義的函數(shù)匿名函數(shù)將函數(shù)作為參數(shù)或者返回值MANIFEST清單分析.assembly指令用于定義編譯目標(biāo)或加載外部庫(kù).ctor表示構(gòu)造函數(shù).ver表示引用版本.publickeytoken表示應(yīng)用程序?qū)嶋H公鑰標(biāo)記.hash algorithm表示實(shí)現(xiàn)
21、安全性的哈希算法系統(tǒng)缺省值為0x00008004.moulde為程序指令集,表明定義模塊的的元數(shù)據(jù),以指定當(dāng)前模塊Imagebase為影響基地址.file alignment 為文件對(duì)其數(shù)值.subsystem為連接系統(tǒng)類型,0x0003表示從控制臺(tái)運(yùn)行.corflags 為實(shí)質(zhì)運(yùn)行庫(kù)頭文件標(biāo)志,默認(rèn)值1類分析.class表明是一個(gè)類auto表明程序加載時(shí)內(nèi)存的布局是有CLR決定的,而不是其本身ansi屬性則為了在沒有托干和被托管代碼之間實(shí)現(xiàn)無縫轉(zhuǎn)換beforefiledinit屬性為類提供了一個(gè)附加信息,用于標(biāo)記運(yùn)行庫(kù)可以在任何時(shí)候執(zhí)行構(gòu)造函數(shù)方法,只要該方法在第一次被訪問其靜態(tài)之間執(zhí)行即可
22、.ctor方法Cil managed說明方法體中為IL代碼,指示編譯器編譯為托管代碼.maxstack表明執(zhí)行構(gòu)造函數(shù),ctor期間的評(píng)估堆棧可容納數(shù)據(jù)項(xiàng)的最大個(gè)數(shù)IL_0000是一個(gè)標(biāo)記代碼的開頭,一般來說,IL_標(biāo)記之前的部分為變量的聲明和初始化Ldarg.0表示裝在第一個(gè)成員參數(shù),在實(shí)例方法中指的是當(dāng)前實(shí)例的引用,該引用將用于在基類構(gòu)造函數(shù)中調(diào)用call調(diào)用靜態(tài)方法和構(gòu)造方法,callvirt調(diào)用實(shí)例方法Main方法.entrypoint指令表明了CLR加載程序時(shí),是首先從,entrypoint方法開始執(zhí)行的Ldst表示字符壓棧hidebysig屬性表示如果當(dāng)前類作為父類時(shí),類中的方法不
23、會(huì)被子類繼承IL語(yǔ)言IL是一種面向?qū)ο蟮臋C(jī)器語(yǔ)言,因此具有面向?qū)ο笳Z(yǔ)言的所有特性。;類、對(duì)象、繼承、多態(tài)等仍然是IL語(yǔ)言的基本概念I(lǐng)L之零零獨(dú)立于CPU指令,CLR通過JIT編譯機(jī)制將其轉(zhuǎn)換為本地代碼IL和元數(shù)據(jù)是了解CLR運(yùn)行機(jī)制的重要內(nèi)容 Initobj構(gòu)造新的值類型,完成值類型初始化;完成設(shè)定對(duì)指定的存儲(chǔ)單元的指針指控newobj在初始化過程中會(huì)調(diào)用構(gòu)造函數(shù)newarr用來創(chuàng)建一組從零其實(shí)的數(shù)組string類型的創(chuàng)建由ldstr指令來完成call用于執(zhí)行靜態(tài)調(diào)度,而callvirt用于執(zhí)行動(dòng)態(tài)調(diào)度 通用類型系統(tǒng)規(guī)則:.NET中,所有類型都繼承中System.Object類可以給類型創(chuàng)建別
24、名,例如using mynet=A.MyClass一個(gè)對(duì)象的獲取辦法是:obj.GetType()Typeof操作符則常在反射時(shí),回去自定義類的Type對(duì)象,從而可以獲取該類型的方法、屬性等可以使用CLSCompliantAttribute將程序集、模塊、類型和成員標(biāo)記為符合CLS或不符合CLSIL中使用/checked+開關(guān)來進(jìn)行基元類型的溢出檢查,在C#中實(shí)現(xiàn)這一功能的是checked和unchecked操作符命名空間時(shí)長(zhǎng)功能角度對(duì)類型的劃分,是一組類型在邏輯上的機(jī)集合值類型和引用類型內(nèi)存分配值類型實(shí)例總是分配在它聲明的地方,聲明為局部變量時(shí)其被分配在堆棧上,聲明為引用類型成員時(shí)其被分配在
25、托管堆上;引用類型的實(shí)例總是被分配在托管堆上 值類型 繼承自ValueType(注意System.ValueType繼承自System.Object);而引用類型繼承自System.Object值類型包含其實(shí)例數(shù)據(jù),每個(gè)變量保存率其本身的數(shù)據(jù)拷貝在默認(rèn)情況下值類型的參數(shù)傳遞不會(huì)影響參數(shù)本身;而引用類型變量保存了其數(shù)據(jù)的引用地址,因此以按值方式進(jìn)行參數(shù)傳遞會(huì)影響參數(shù)本身,因?yàn)閮蓚€(gè)變量會(huì)引用內(nèi)存中的同一塊地址典型值類型為:struct、enum以及大量?jī)?nèi)置值類型;能稱為類的可以說是引用類型值類型的內(nèi)存不由GC來控制,作用域結(jié)束時(shí),值類型會(huì)自動(dòng)釋放,減少托管壓力,因此具有性能上的優(yōu)勢(shì)值類型是密封的,
26、因此不能作為其他任何類型的基類,但是可以但集成或者多繼承接口;引用類型一般都有幾次性值類型不具有多態(tài)性;而引用類型有多態(tài)性值類型不可為null值,值類型都會(huì)自動(dòng)初始化為0值;引用類型變量默認(rèn)情況下,創(chuàng)建為null值,表示沒有指向任何托管堆地址值類型有兩種狀態(tài):裝箱和未裝箱,運(yùn)行庫(kù)提供了所有值類型的已裝箱形式;而引用類型通常只有一種形式:裝箱值類型應(yīng)用場(chǎng)合數(shù)據(jù)較小的場(chǎng)合,最好考慮以值類型來實(shí)現(xiàn)系統(tǒng)性能的改善結(jié)構(gòu)簡(jiǎn)單,不必在多態(tài)的情況下類型的性質(zhì)不表現(xiàn)出行為時(shí),不必以類來實(shí)現(xiàn),那么以存取數(shù)據(jù)為主要目的的情況下,值類型是優(yōu)先考慮的參數(shù)傳遞時(shí),值類型默認(rèn)情況下傳遞的是實(shí)例數(shù)據(jù),而不是內(nèi)存地址,因此數(shù)據(jù)
27、傳遞情況下的選擇,取決于函數(shù)內(nèi)部的實(shí)現(xiàn)邏輯。值類型可以有高效的內(nèi)存支持,并且在不暴露內(nèi)部結(jié)構(gòu)的情況下返回實(shí)例的副本,從安全上考慮值類型,但過多的值類型傳遞也會(huì)損傷性能的優(yōu)化值類型沒有繼承性,如果類型的選擇,沒有子類繼承的必要,優(yōu)先考慮值類型在有可能引起裝箱與拆箱操作的集合或者隊(duì)列中,值類型不是很好的選擇,因?yàn)闀?huì)引起對(duì)值類型的裝箱操作,導(dǎo)致額外內(nèi)存的分配例如頻繁調(diào)用Hashtable對(duì)象的Add方法時(shí)將產(chǎn)生大量的裝箱操作引用類型應(yīng)用的場(chǎng)合可以簡(jiǎn)單的的說,引用類型是.NET世界的職業(yè)殺手,. NET世界就是由引用類型構(gòu)成的,類是面向?qū)ο蟮幕靖拍睿彩浅绦蚩蚣艿幕疽?,因此靈活的的護(hù)具封裝特性使
28、得引用類型成為主流引用類型適用于結(jié)構(gòu)復(fù)雜、有繼承性、有多態(tài)、突出行為的場(chǎng)合參數(shù)傳遞情況也是需要考慮的情況解析Main(string args),Main函數(shù)的參數(shù)可以為空,也可以是string數(shù)組,其作用是接受命令行參數(shù),例如在命令行運(yùn)行程序時(shí),args提供了輸入命令行參數(shù)入口Params用法Param修士的必須為一堆數(shù)組,事實(shí)上通常就是以群的方式來實(shí)現(xiàn)或多個(gè)或者任意多個(gè)參數(shù)的控制的,而數(shù)組是最簡(jiǎn)單的選擇param是修飾的參數(shù)數(shù)組,可以是任何類型。因此,如果需要接受任何類型的參數(shù)時(shí),只要設(shè)置數(shù)組類型為object即可params必須在參數(shù)列表的最后的一個(gè),并且只能使用一次ref和out不同點(diǎn)r
29、ef 要求傳遞之前的參數(shù)必須首先顯示初始化,而out不需要。也就是說,使用ref的參數(shù)必須是一個(gè)實(shí)際的對(duì)象,而不能指向null;而使用out的參數(shù)可以接受指向null的對(duì)象然后再調(diào)用方法的內(nèi)部必須完成對(duì)象的實(shí)體化裝箱就是值類型數(shù)據(jù)轉(zhuǎn)換為無類型的引對(duì)象拆箱就是引用類型轉(zhuǎn)換為值類型裝箱與拆箱雷區(qū)裝箱的概念與拆箱的概念不是完全對(duì)等的互逆操作,從內(nèi)存角度上來看,拆箱的性能開銷遠(yuǎn)小于裝箱,只是在實(shí)際的執(zhí)行中,拆箱之后常常伴隨著字段的拷貝,以C#而言,編譯器總會(huì)自動(dòng)產(chǎn)生拆箱后的字段拷貝只有被裝過象的對(duì)象才能被拆箱,而并非所有的引用類型。將并非裝箱而來的引用類型強(qiáng)制轉(zhuǎn)換為值類型,將拋出InvalidCasE
30、xception裝箱過程解析內(nèi)存分配:在托管堆中分配內(nèi)存空間,內(nèi)存的大小為預(yù)裝值類型的大小加上其他額外的內(nèi)存空間,主要包括方法表指針和SyncBlockIndex,這兩個(gè)成員用于CLR管理引用類型對(duì)象實(shí)例拷貝:將值類型的字段拷貝到新分配的內(nèi)存中地址返回:將托管堆中的對(duì)象地址返回給新的引用類型拆箱過程解析實(shí)例檢查:首先檢查是否為null,如果是則拋出NullReferenceException異常;如果不是檢查對(duì)象實(shí)例,確保它是給定類型的裝箱值,并保證拆箱后的類型為原來的同一類型,否則會(huì)拋出InvalidCasException異常提示:在代碼中,要顯式 的判斷裝箱后的引用類型的原始類型??梢杂?/p>
31、以下幾種方法來判斷Is操作符法if(o is Int32)Console.WriteLine(“Its Int32 type”);GetType法Console.WriteLine(o.GetType();指針返回:返回已經(jīng)裝箱對(duì)象中屬于原值類型部分字段的地址。而附加成員:方法指針域SyncBlockIndex對(duì)該指針是不可見的裝箱與拆箱的規(guī)則類型一致,拆箱必須保證執(zhí)行后的結(jié)果是原來裝箱時(shí)的類型,否則將拋出InvalidCasException異常裝箱與拆箱主要是針對(duì)值類型而言的,引用類型總是以裝箱形式存在的裝箱和拆箱分為顯式轉(zhuǎn)換和隱式轉(zhuǎn)換兩種情況,在實(shí)際的編碼中應(yīng)該警惕隱式轉(zhuǎn)換帶來的性能與異
32、常 CLR管理內(nèi)存的區(qū)域主要有三塊,分別為:線程堆棧,用于分配值類型堆棧GC堆,用于分配小的對(duì)象實(shí)例(小于85000字節(jié))LOH堆,用于分配大對(duì)象實(shí)例(不小于85000字節(jié))內(nèi)存分配中相關(guān)的IL指令:newobj,用于創(chuàng)建引用類型對(duì)象ldstr,用于創(chuàng)建string對(duì)象newarr,用于分配新的數(shù)組對(duì)象box,在值類型轉(zhuǎn)換為引用類型對(duì)象時(shí),將值類型字段拷貝到托管堆上發(fā)生的內(nèi)存分配 值類型中的引用類型字段和引用類型中的值類型字段的內(nèi)存分配對(duì)于值類型嵌套引用類型的情況,引用類型變量作為值類型的成員變量,在堆棧上保存該成員的引用,而實(shí)際上的引用類型仍保存在GC堆上(結(jié)構(gòu)實(shí)例化)對(duì)于引用類型嵌套值類型
33、的情況,則該值類型將作為引用實(shí)例的一部分保存在GC堆上(類實(shí)例化)代齡垃圾收集器將托管堆中的對(duì)象分為三代,分別為:0,1,2 闕值分別為:256KB,2MB,10MB當(dāng)有垃圾回收時(shí),未被回收的對(duì)象代齡將提升一級(jí)僅當(dāng)?shù)?代對(duì)象釋放的內(nèi)存不足以創(chuàng)建新對(duì)象時(shí),同時(shí)1代對(duì)象的體積也超出了容量闕值時(shí),垃圾回收器將同時(shí)對(duì)第0代和第1代對(duì)象進(jìn)行垃圾回收垃圾回收小結(jié)CLR 提供了一種分代式、標(biāo)記清除型GC,利用標(biāo)記清除算法來對(duì)不同代齡的對(duì)象進(jìn)行垃圾收集和內(nèi)存緊縮,保證了運(yùn)算效率和執(zhí)行優(yōu)化一個(gè)對(duì)象沒有被其他任何對(duì)象引用,則該對(duì)象被認(rèn)為是可回收對(duì)象最好不要通過刁穎GC.Collect來強(qiáng)制執(zhí)行垃圾回收垃圾對(duì)象并非
34、立即被執(zhí)行內(nèi)存清理,GC可以在任何時(shí)候執(zhí)行垃圾收集對(duì)“胖”對(duì)象考慮弱引用,以提高性能Finalize方法規(guī)則在C#中無法顯式重寫Finalize方法,只有通過析構(gòu)函數(shù)語(yǔ)法形式來實(shí)現(xiàn)struct中不允許定義析構(gòu)函數(shù),只有class中才可以,并且只能有一個(gè)Finalize方法不能被繼承或重載析構(gòu)函數(shù)不能加任何修飾符,不能帶參數(shù),也不能顯式調(diào)用,唯一例外是在子類重寫時(shí),通過base調(diào)用父類Finalize方法,而且這種方式也被隱式封裝在析構(gòu)函數(shù)中執(zhí)行垃圾回收?qǐng)?zhí)勤系統(tǒng)會(huì)自動(dòng)執(zhí)行終止化操作Finalize方法中,可以實(shí)現(xiàn)使得被清理對(duì)象復(fù)活的機(jī)制,不過這種操作相當(dāng)危險(xiǎn),而且沒有什么實(shí)際意義Finalize
35、方法和Dispose方法規(guī)則:對(duì)于非托管資源的清理,F(xiàn)inalize由GC自行調(diào)用,而Dispose由開發(fā)者強(qiáng)制調(diào)用盡量避免使用Finalize方式來清理資源,必須實(shí)現(xiàn)Finalize時(shí),也應(yīng)一并實(shí)現(xiàn)Dispose方法,來提供顯式調(diào)用的控制權(quán)限通過GC.SuppressFinalize可以免除終結(jié)垃圾回收是,執(zhí)行終結(jié)器的準(zhǔn)確時(shí)間是不確定的,除非顯式調(diào)用Dispose或者Close方法強(qiáng)烈建議不要重寫Finalize方法,同時(shí)強(qiáng)烈建議在任何有非托管資源訪問的類中同時(shí)實(shí)現(xiàn)終止化操作和Dispose模式Finalize和Dispose方法,只能清理非托管資源,釋放內(nèi)存仍由GC負(fù)責(zé)對(duì)象使用完畢應(yīng)該立即
36、釋放其資源,最好顯式調(diào)用Dispose方法來實(shí)現(xiàn)性能條款推薦一Dispose模式來替代Finalize方式選擇合適的垃圾手收集器:工作站GC和服務(wù)器GC在適當(dāng)?shù)那闆r下實(shí)現(xiàn)對(duì)對(duì)象的弱引用盡可能用using來執(zhí)行資源清理推薦使用泛型集合來替代非泛型集合特定類型的Array性能優(yōu)于ArrayList(向ArrayList添加其他值類型元素會(huì)發(fā)生裝箱與拆箱操作)字符串滯留機(jī),是CLR為string類型實(shí)現(xiàn)的特殊設(shè)計(jì)合理使用System.String和System.Text.StringBuilder(簡(jiǎn)單字符串用String復(fù)雜用StringBuilder)盡量在子類中重寫ToString方法for和
37、foreach的選擇以多線程處理應(yīng)對(duì)系統(tǒng)設(shè)計(jì)盡可能少拋出異常,禁止將異常處理放在循環(huán)內(nèi)捕獲異常時(shí),catch塊中盡量指定具體的異常篩選器,多個(gè)catch塊應(yīng)該保證異常由特殊到一般的排列順序Struct和class性能比較以is/as模式進(jìn)行類型兼容性檢查(is實(shí)現(xiàn)類型判斷,as實(shí)現(xiàn)安全的類型轉(zhuǎn)換)const和static readonly的權(quán)衡 (推薦static readonly)盡量使用一組零基數(shù)組new關(guān)鍵字new一個(gè)class是,new完成了以下兩個(gè)方面的內(nèi)容:一是調(diào)用newobj命令來為實(shí)例在托管堆中分配內(nèi)存;二是用構(gòu)造函數(shù)來實(shí)現(xiàn)對(duì)象的初始化new一個(gè)struct時(shí),new運(yùn)算符用于
38、調(diào)用其構(gòu)造函數(shù),實(shí)現(xiàn)實(shí)例初始化new一個(gè)int時(shí),new運(yùn)算符將其初始化為0new運(yùn)算符不可重載new內(nèi)存分配失敗,將引發(fā)OutOfMemoryException異常this和base關(guān)鍵字base常用于派生類對(duì)象初始化時(shí)和基類進(jìn)行通信base可以訪問基類的公有成員和受保護(hù)成員,私有成員是不可訪問的this指代對(duì)象本身base可以指向父類的方法有兩種:一是有重載存在的情況下,base將指向直接繼承的父類成員方法在沒有重載的情況下可以指向任何上級(jí)父類的共有或者受保護(hù)方法base和this盡量少用或者不用base和this。除了決議子類的名稱沖突和在一個(gè)構(gòu)造函數(shù)中調(diào)用其他的構(gòu)造函數(shù)之外,base和
39、this使用容易引起不必要的結(jié)果在靜態(tài)成員中使用base和this是不允許的。原因是。Base和this訪問都是淚的實(shí)例,也就是對(duì)象,而靜態(tài)成員只能由類來訪問。Base是為了實(shí)現(xiàn)多態(tài)而設(shè)計(jì)的使用this或base關(guān)鍵字只能指定一個(gè)構(gòu)造函數(shù),也就是說不可同時(shí)將this和base作用在一個(gè)構(gòu)造函數(shù)上。簡(jiǎn)單來說,base用于在派生類中訪問重寫的基類成員;而this用于訪問本類的成員,當(dāng)然也包括繼承而來的共有成員除了base,訪問基類成員的令外一種方式是:顯式類型轉(zhuǎn)換來實(shí)現(xiàn)的using說明using引入的是邏輯結(jié)構(gòu),C語(yǔ)言中的#include引入物理類庫(kù)using引入命名空間并不等于一定會(huì)被加載,只有
40、用到時(shí)才加載using一般放在C#源文件開頭,但不是強(qiáng)制的null規(guī)則null為引用類型變量的默認(rèn)值,為引用類型的概念范疇null不同于0、”、string.Empty引用is或as模式對(duì)類型驚喜判斷或裝換是,需要進(jìn)一步的null檢查判斷一個(gè)變量是否為null,可以應(yīng)用=或!=操作符來完成對(duì)任何值為null的變量操作,都會(huì)拋出NullReferenceException異??煽疹愋托〗Y(jié)可控類型表示為null的值類型不允許使用嵌套的可空類型,例如Nullable<Nullable<T>>Nullable<T>和T?是等效的對(duì)可空類型執(zhí)行GetType方法,將返
41、回類型T,而不是Nullable<T>C#允許可控類型上執(zhí)行轉(zhuǎn)換和轉(zhuǎn)型,例如Int? a=100;Int32 b=(Int32)a;a=null;int? c=(int?)200;Null Object模式小結(jié)有效解決對(duì)象為空的情況,為值為null提供可靠保證保證能夠返回有效的默認(rèn)值,例如在一個(gè)List<User> userList中能夠保證任何情況下都有有效值返回,可以保證usrList操作的有效性提供統(tǒng)一判定的IsNull屬性null object要保持原object的所有成員的不變性,所以是我們常常將其實(shí)現(xiàn)為Sigleton模式expicit,用于聲明必須強(qiáng)制轉(zhuǎn)換
42、的自定義類型轉(zhuǎn)換操作符implicit,用于聲明隱式的自定義類型轉(zhuǎn)換操作符使用轉(zhuǎn)換運(yùn)算符進(jìn)行類型轉(zhuǎn)換的一般規(guī)則所有轉(zhuǎn)換必須是static的類型轉(zhuǎn)換可能存在信息丟失或者精度損失,對(duì)于有損轉(zhuǎn)換,最好提供顯式的類型轉(zhuǎn)換,并且這種有損轉(zhuǎn)換不被允許時(shí),應(yīng)在顯式轉(zhuǎn)換中拋出IvalidCastException異常用戶定義運(yùn)算符不能是封閉類型對(duì)象,也不能裝換成封閉類型對(duì)象,否則將引發(fā)編譯時(shí)異常,例如public static implicit operator MyAge(MyAge age)return age;顯式和隱式轉(zhuǎn)換是個(gè)值得權(quán)衡的選擇:隱式轉(zhuǎn)換較為靈活,可讀性強(qiáng),但必須保證不會(huì)引發(fā)異常或者發(fā)生有
43、損轉(zhuǎn)換,否則會(huì)引起不必要的轉(zhuǎn)換結(jié)果,這種情況下則實(shí)現(xiàn)為顯式轉(zhuǎn)換較為妥當(dāng)運(yùn)算符只能按值傳遞,不能按引用傳遞,因此不能采用ref和outyield應(yīng)用規(guī)則yield只能應(yīng)用于迭代器中,無論yield return返回何種方法類型,方法必須返回以下的接口類型:System.Collections.Gereic.IEnumerable<T>、System.Collections.IEnumerable、System.Colections.Generic.IEnumerator<T>或System.Colections.IEnumerator。yield語(yǔ)句不允許應(yīng)用于不安全塊中
44、yield return不支持帶有ref或者嘔吐參數(shù),因?yàn)槟菚?huì)使得狀態(tài)機(jī)難以維護(hù)yield語(yǔ)句不能應(yīng)用于匿名方法中yield語(yǔ)句不能出現(xiàn)在catch塊中,或者包含catch字句try塊中,也不能出現(xiàn)在finally塊中l(wèi)ock小結(jié)lock對(duì)象必須是引用類型參數(shù)避免鎖定公共對(duì)象或不受應(yīng)用程序控制的對(duì)象實(shí)例,最好定義private對(duì)象來鎖定string類型對(duì)象對(duì)多線程操作=是安全的,因此不建議鎖定字符串類型對(duì)象。事實(shí)上,由于字符串的駐留機(jī)制,在整個(gè)應(yīng)用程序中可能只有一個(gè)實(shí)例,字符串鎖定可能會(huì)導(dǎo)致不必要的阻塞或死鎖避免死鎖。讓兩個(gè)線程以相同的加鎖順序鎖定對(duì)象,是避免死鎖的有效手段Monitor類還提
45、供了一個(gè)TryEnter方法,使用上更加靈活。二者區(qū)別是,lock會(huì)一致等待鎖定對(duì)象釋放后下一線程才能進(jìn)入;而TryEnter會(huì)返回當(dāng)前線程是否獲取該鎖,是則返回true,否則返回false線程同步最好只應(yīng)用在需要的時(shí)候,因?yàn)殒i定對(duì)象對(duì)系統(tǒng)性能存在影響:一方面是加鎖的系統(tǒng)開銷;另一方面可能導(dǎo)致其他線程因?yàn)榈却尫艑?duì)象而暫停執(zhí)行sealed不能喝abstract公用,因?yàn)槊芊忸惒荒鼙焕^承,而抽象類又總希望被繼承,二者語(yǔ)意抵觸,不可共存定義密封方法,sealed必須和override一起使用性能優(yōu)化,一方面是密封類不用作基類,另一方面對(duì)于密封類成員的虛方法調(diào)用將轉(zhuǎn)換為非虛方法的處理機(jī)制,因此在成本
46、上略高于虛方法的執(zhí)行機(jī)制string類型是密封的struct是隱式密封的,因此不能被繼承,例如System.Decimal等密封類一個(gè)常見的應(yīng)用就是:當(dāng)一個(gè)類只有靜態(tài)成員時(shí),可以考慮將其實(shí)現(xiàn)為密封類,例如.NET框架中的System.Math、System.Drawing.Pen等const、readonly和static readonlyconst、readonly和static readonly定義的我常量,指定初始值后(包括在構(gòu)造函數(shù)內(nèi)指定初始值)將不可更改,可讀不可寫const必須在聲明時(shí)指定初始值;而readonly和static readonly在聲明時(shí)可以指定也可以不指定初始值,
47、同時(shí)也可以在構(gòu)造函數(shù)內(nèi)指定初始值,如果同時(shí)在聲明時(shí)和構(gòu)造函數(shù)內(nèi)指定初始值,以構(gòu)造函數(shù)內(nèi)指定的值為準(zhǔn)const和static readonly定義的常量是靜態(tài)的只能由類型直接訪問;而readonly定義的常量是非靜態(tài)的,只能由實(shí)例對(duì)象訪問static readonly常量,如果在構(gòu)造函數(shù)內(nèi)指定初始值,則必須是靜態(tài)無參構(gòu)造函數(shù)const可以定義局部變量和字段;而readonly 和static readonly不能定義局部變量,只能定義字段常量。實(shí)際上,readonly應(yīng)該稱之為只讀字段,因此局限于定義字段;而const才是常量,可以定義字段和局部變量 struct中不可以有無參的構(gòu)造函數(shù) 抽象類
48、和接口比較請(qǐng)記住,面向?qū)ο蟮囊粋€(gè)重要原則就是:面向接口編程面向抽象編程,通過封裝變化來實(shí)現(xiàn)實(shí)體間的關(guān)系抽象類應(yīng)著重于關(guān)系密切的對(duì)象,而接口最適合為不相關(guān)的類提供通用的功能接口著重于CAN-DO關(guān)系類型,而抽象類偏重于IS-A式關(guān)系接口多定義對(duì)象的行為;而抽象類多定義對(duì)象的屬性接口的定義可以使用public、protected、internal、和private修飾符,大部分接口都被定義為public,另外方法的訪問級(jí)別不能低于接口的訪問級(jí)別,否則將導(dǎo)致編譯錯(cuò)誤“接口不變”,是應(yīng)該考慮的重要因素。所以在由 接口擴(kuò)展時(shí),應(yīng)增加新的接口,而不能更改現(xiàn)有接口盡量將接口設(shè)計(jì)成功能單一的功能塊在接口中所有
49、方法都默認(rèn)為public如果預(yù)計(jì)會(huì)出現(xiàn)版本問題,可創(chuàng)建抽象類。而向接口中添加新成員則會(huì)強(qiáng)制要求修改所有派生類,并重新編譯,所以版本式的問題最好以抽相類來實(shí)現(xiàn)從抽象類派生出的非抽此昂類必須包括繼承的所有抽象方法和抽象訪問器的實(shí)現(xiàn)對(duì)抽象類不能使用new關(guān)鍵字,也不能被密封,原因是抽象類不能被實(shí)例化抽象方法聲明中不能使用static或virtual修飾符is模式檢查對(duì)象類型的兼容性,并返回結(jié)果:true或false不會(huì)拋出異常如果對(duì)象為null,則返回值永遠(yuǎn)為false典型用法為:class ISSample public static void object o=new object(); /執(zhí)行
50、第一次類型兼容性檢查 if(o is ISSample) /執(zhí)行第二次類型兼容性檢查 ISSample a=(ISSample)o;as模式檢查對(duì)象類型的兼容性,并返回結(jié)果,如果不兼容就返回null不會(huì)拋出異常如果結(jié)果判斷為空,則強(qiáng)制執(zhí)行類型轉(zhuǎn)換將拋出NullReferenceException異常as必須和引用類型一起使用典型用法為:class ASSample public static void Main() object o=new object(); /執(zhí)行一次兼容性檢查 ASSample b=o as ASSample; if(b!=null) /執(zhí)行關(guān)于b操作虛方法不能是靜態(tài)的、
51、密封的覆寫實(shí)現(xiàn)的多態(tài)確定于運(yùn)行時(shí),因此更加靈活;重載實(shí)現(xiàn)的多態(tài)確定于編譯時(shí),因此更加高效和簡(jiǎn)單靜態(tài)構(gòu)造函數(shù)和實(shí)例構(gòu)造函數(shù)的比較靜態(tài)構(gòu)造函數(shù)可以和無參構(gòu)造函數(shù)共存。雖然參數(shù)列表相同,但二者的執(zhí)行時(shí)間不同,靜態(tài)構(gòu)造函數(shù)在運(yùn)行庫(kù)加載時(shí)執(zhí)行;而實(shí)例構(gòu)造函數(shù)則在實(shí)例創(chuàng)建時(shí)執(zhí)行靜態(tài)構(gòu)造函數(shù)只能對(duì)靜態(tài)成員進(jìn)行初始化操作,不能作用于非靜態(tài)成員;而實(shí)例構(gòu)造函數(shù),可以初始化實(shí)例成員和,也可以初始化靜態(tài)成員,但靜態(tài)只讀字段除外靜態(tài)構(gòu)造函數(shù)只被執(zhí)行一次,而.NET運(yùn)行庫(kù)也無法確定靜態(tài)構(gòu)造函數(shù)在什么時(shí)候被執(zhí)行;而實(shí)例構(gòu)造函數(shù)可以在多次實(shí)例創(chuàng)建時(shí)被執(zhí)行多次一個(gè)類只能有一個(gè)靜態(tài)構(gòu)造函數(shù);而一個(gè)類只能有多個(gè)實(shí)例構(gòu)造函數(shù)靜態(tài)字
52、段的初始值在靜態(tài)函數(shù)調(diào)用之前被指定靜態(tài)成員可以在聲明時(shí)初始化,也可以通過靜態(tài)構(gòu)造函數(shù)初始化,這兩種初始化只能被執(zhí)行一次靜態(tài)成員屬于類所有,無論創(chuàng)建多少實(shí)例對(duì)象,靜態(tài)成員在內(nèi)存中只有一份ArrayList實(shí)現(xiàn)了IList、ICollection、IEnumerable和ICloneable接口代碼:public class ArrayList: IList, ICollection, IEnumerable, ICloneableIEnumerable接口的定義可表示為:public interface IEnumerable IEnumerable GetEnumerable();/為fore
53、ach操作提供支持ICollection接口定義為:public interface ICollection:IEnumerable void CopyTo(Arrary arry ,int index);/將集合拷貝到數(shù)組 int Count get;/條目數(shù)量 bool IsSynchronized get;/支持線程同步操作 object SyncRoot get;/支持線程同步操作IList接口定義為public interface IList:ICollection, IEnumerable int Add(object value);void Clear();bool Contai
54、ns(object value);int IndexOf(object value);void Insert ( int index,object value);void Remove (object value);void RemoveAt(int index);bool IsFixedSize get;bool IsReadOnly get;object this int index get;set;ArrayList和Array較相同點(diǎn):ArrayList和ArrayList均實(shí)現(xiàn)了相同的接口,因此具有很多操作方法都相同,例如對(duì)自身進(jìn)行枚舉,能夠foreach遍歷集合成員等Array和A
55、rrayList創(chuàng)建的對(duì)象均存儲(chǔ)在托管堆中不同點(diǎn):Array只能存儲(chǔ)同構(gòu)對(duì)象,不過聲明為Object類型的數(shù)組除外,因?yàn)槿魏晤愋投伎梢噪[式轉(zhuǎn)換為Object類型;ArrayList可以存儲(chǔ)異構(gòu)對(duì)象,這是因?yàn)樵诒举|(zhì)上ArrayList內(nèi)部維護(hù)著一個(gè)Object items類型字段。在應(yīng)用ArrayList時(shí),應(yīng)考慮裝箱與拆箱帶來的性能損失。Array可以是一維的,也可以是多維的;ArrayList只能是一維的Array的容量是固定的,一旦聲明不可更改;ArrayList的容量是動(dòng)態(tài)增加的。添加元素超過初始容量時(shí),ArrayList會(huì)根據(jù)需要重新分配,還可以通過TirmToSize方法將其空項(xiàng)刪除來壓縮體積Array下限可以設(shè)置;而ArrayList的下限只能為0Array只有簡(jiǎn)單的方法來完成對(duì)元素的操作,不能隨意增加或刪除數(shù)組元素;ArrayList提供了豐富的方法來完成對(duì)元素的操作對(duì)空數(shù)組元素進(jìn)行操作可能會(huì)引發(fā)異常,因此操作之前判斷是否為空是很有必要的Queue和StackQueue和stack的默認(rèn)值不同,Queue為32,而Stack為10關(guān)于Queue方法:Enqueue用于向?qū)ξ蔡砑釉?,Dequeu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- AI知識(shí)應(yīng)用課件下載
- 膽總管結(jié)石的護(hù)理查房
- 臨江市2025年重點(diǎn)中學(xué)小升初數(shù)學(xué)入學(xué)考試卷含解析
- 遼寧省大連市一零三中學(xué)2025年高三下學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)生物試題理試題含解析
- 天津交通職業(yè)學(xué)院《擒拿防衛(wèi)術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 商河縣2025年數(shù)學(xué)五年級(jí)第二學(xué)期期末復(fù)習(xí)檢測(cè)模擬試題含答案
- 廣東金融學(xué)院《老年社區(qū)工作》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年江西省撫州市臨川二中高三下學(xué)期第二次周考英語(yǔ)試題含解析
- 中南財(cái)經(jīng)政法大學(xué)《歲嬰幼兒早期教育》2023-2024學(xué)年第二學(xué)期期末試卷
- 山西警官職業(yè)學(xué)院《人體機(jī)能學(xué)實(shí)驗(yàn)一》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年03月黑龍江綏化市市委書記進(jìn)校園引才活動(dòng)公開招聘1167人筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 太原市2025年高三年級(jí)模擬考試語(yǔ)文試題及答案
- 青島版(2017)小學(xué)四年級(jí)科學(xué)下冊(cè)4.14《不同環(huán)境中的植物》課件
- 直擊重點(diǎn)的2024年ESG考試試題與答案
- 2025年河南應(yīng)用技術(shù)職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)完美版
- 綜合與實(shí)踐+白晝時(shí)長(zhǎng)規(guī)律的探究教案+2024-2025學(xué)年人教版數(shù)學(xué)七年級(jí)下冊(cè)
- 非營(yíng)利組織離任審計(jì)報(bào)告范文
- 家電行業(yè)品質(zhì)部門的質(zhì)量提升職責(zé)
- 抖音服裝網(wǎng)店創(chuàng)業(yè)計(jì)劃書
- 2025年人工智能-智能算法考試題庫(kù)及答案(新版)
- 國(guó)家電投集團(tuán)招聘筆試沖刺題2025
評(píng)論
0/150
提交評(píng)論