版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、方法 通常系統(tǒng)需求描述的核心名詞好書不能只讀一遍,這兩天又翻看了一遍你必須知道的.NET,重溫了下基礎(chǔ),重溫了下經(jīng)典,簡單記錄了下來。內(nèi)存分配:CLR管理內(nèi)存的區(qū)域,主要有三塊,分別為:線程的堆棧,用于分配值類型實(shí)例。堆棧主要由操作系統(tǒng)管理,而不受垃圾收集器的控制,當(dāng)值類型實(shí)例所在方法結(jié)束時(shí),其存儲(chǔ)單位自動(dòng)釋放。棧的執(zhí)行效率高,但存儲(chǔ)容量有限。GC堆,用于分配小對(duì)象實(shí)例。如果引用類型對(duì)象的實(shí)例大小小于85000字節(jié),實(shí)例將被分配在GC堆上,當(dāng)有內(nèi)存分配或者回收時(shí),垃圾收集器可能會(huì)對(duì)GC堆進(jìn)行壓縮,詳情見后文講述。LOH(Large Object Heap)堆,用于分配大對(duì)象實(shí)例。如果引用類型對(duì)
2、象的實(shí)例大小不小于850 00字節(jié)時(shí),該實(shí)例將被分配到LOH堆上,而LOH堆不會(huì)被壓縮,而且只在完全GC回收時(shí)被回收。堆棧的內(nèi)存分配機(jī)制:對(duì)于值類型來說,一般創(chuàng)建在線程的堆棧上。但并非所有的值類型都創(chuàng)建在線程的堆棧上,例如作為類的字段時(shí),值類型作為實(shí)例成員的一部分也被創(chuàng)建在托管堆上;裝箱發(fā)生時(shí),值類型字段也會(huì)拷貝在托管堆上。引用類型的實(shí)例分配于托管堆上,而線程棧卻是對(duì)象生命周期開始的地方。對(duì)32位處理器來說,應(yīng)用程序完成進(jìn)程初始化后,CLR將在進(jìn)程的可用地址空間上分配一塊保留的地址空間,它是進(jìn)程(每個(gè)進(jìn)程可使用4GB)中可用地址空間上的一塊內(nèi)存區(qū)域,但并不對(duì)應(yīng)于任何物理內(nèi)存,這塊地址空間即是托
3、管堆。托管堆又根據(jù)存儲(chǔ)信息的不同劃分為多個(gè)區(qū)域,其中最重要的是垃圾回收堆(GC Heap)和加載堆(Loader Heap),GC Heap用于存儲(chǔ)對(duì)象實(shí)例,受GC管理;Loader Heap又分為High-Frequency Heap、Low-Frequency Heap和Stub Heap,不同的堆上又存儲(chǔ)不同的信息。Loader Heap最重要的信息就是元數(shù)據(jù)相關(guān)的信息,也就是Type對(duì)象,每個(gè)Type在Loader Heap上體現(xiàn)為一個(gè)Method Table(方法表),而Method Table中則記錄了存儲(chǔ)的元數(shù)據(jù)信息,例如基類型、靜態(tài)字段、實(shí)現(xiàn)的接口、所有的方法等等。Loader
4、 Heap不受GC控制,其生命周期為從創(chuàng)建到AppDomain卸載。在進(jìn)入實(shí)際的內(nèi)存分配分析之前,有必要對(duì)幾個(gè)基本概念做以交代,以便更好的在接下來的分析中展開討論。TypeHandle,類型句柄,指向?qū)?yīng)實(shí)例的方法表,每個(gè)對(duì)象創(chuàng)建時(shí)都包含該附加成員,并且占用4個(gè)字節(jié)的內(nèi)存空間。我們知道,每個(gè)類型都對(duì)應(yīng)于一個(gè)方法表,方法表創(chuàng)建于編譯時(shí),主要包含了類型的特征信息、實(shí)現(xiàn)的接口數(shù)目、方法表的slot數(shù)目等。SyncBlockIndex,用于線程同步,每個(gè)對(duì)象創(chuàng)建時(shí)也包含該附加成員,它指向一塊被稱為Synchronization Block的內(nèi)存塊,用于管理對(duì)象同步,同樣占用4個(gè)字節(jié)的內(nèi)存空間。Next
5、ObjPtr,由托管堆維護(hù)的一個(gè)指針,用于標(biāo)識(shí)下一個(gè)新建對(duì)象分配時(shí)在托管堆中所處的位置。CLR初始化時(shí),NextObjPtr位于托管堆的基地址。在托管堆中增加新的實(shí)例對(duì)象,只是將NextObjPtr指針增加一定的數(shù)值,再次新增的對(duì)象將分配在當(dāng)前NextObjPtr指向的內(nèi)存空間,因此在托管堆棧中,連續(xù)分配的對(duì)象在內(nèi)存中一定是連續(xù)的,這種分配機(jī)制非常高效。靜態(tài)字段的內(nèi)存分配和釋放,又有何不同?靜態(tài)字段也保存在方法表中,位于方法表的槽數(shù)組后,其生命周期為從創(chuàng)建到AppDomain卸載。因此一個(gè)類型無論創(chuàng)建多少個(gè)對(duì)象,其靜態(tài)字段在內(nèi)存中也只有一份。靜態(tài)字段只能由靜態(tài)構(gòu)造函數(shù)進(jìn)行初始化,靜態(tài)構(gòu)造函數(shù)確
6、保在類型任何對(duì)象創(chuàng)建前,網(wǎng)頁個(gè)性簽名設(shè)計(jì),或者在任何靜態(tài)字段或方法被引用前執(zhí)行,其詳細(xì)的執(zhí)行順序請(qǐng)參考相關(guān)討論。繼承,就是面向?qū)ο笾蓄惻c類之間的一種關(guān)系。繼承的類稱為子類、派生類,而被繼承類稱為父類、基類或超類。通過繼承,使得子類具有父類的屬性和方法,同時(shí)子類也可以通過加入新的屬性和方法或者修改父類的屬性和方法建立新的類層次。繼承機(jī)制體現(xiàn)了面向?qū)ο蠹夹g(shù)中的復(fù)用性、擴(kuò)展性和安全性。為面向?qū)ο筌浖_發(fā)與模塊化軟件架構(gòu)提供了最基本的技術(shù)基礎(chǔ)。Adapter模式主要用于將一個(gè)類的接口轉(zhuǎn)換為另外一個(gè)接口,通常情況下在改變?cè)畜w系的條件下應(yīng)對(duì)新的需求變化,通過引入新的適配器類來完成對(duì)既存體系的擴(kuò)展和改造。
7、Adapter模式就其實(shí)現(xiàn)方式主要包括:類的Adapter模式。通過引入新的類型來繼承原有類型,同時(shí)實(shí)現(xiàn)新加入的接口方法。其缺點(diǎn)是耦合度高,需要引入過多的新類型。對(duì)象的Adapter模式。通過聚合而非繼承的方式來實(shí)現(xiàn)對(duì)原有系統(tǒng)的擴(kuò)展,松散耦合,較少的新類型。繼承:密封類不可以被繼承。繼承關(guān)系中,我們更多的是關(guān)注其共性而不是特性,因?yàn)楣残允菍哟螐?fù)用的基礎(chǔ),而特性是系統(tǒng)擴(kuò)展的基點(diǎn)。實(shí)現(xiàn)單繼承,接口多繼承。從宏觀來看,繼承多關(guān)注于共通性;而多態(tài)多著眼于差異性。繼承的層次應(yīng)該有所控制,否則類型之間的關(guān)系維護(hù)會(huì)消耗更多的精力。面向?qū)ο笤瓌t:多組合,少繼承;低耦合,高內(nèi)聚。.NET中對(duì)象的繼承兩個(gè)原則:1
8、.關(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)限。根據(jù)關(guān)注對(duì)象原則,那么下面的兩種情況又該如何區(qū)別呢?Bird bird2=new Chicken();Chicken chicken=new Chicken();根據(jù)我們上文的分析,bird2對(duì)象和chicken對(duì)象在內(nèi)存布局上是一樣的,差
9、別就在于其引用指針的類型不同:bird2為Bird類型指針,而chicken為Chicken類型指針。以方法調(diào)用為例,不同的類型指針在虛擬方法表中有不同的附加信息作為標(biāo)志來區(qū)別其訪問的地址區(qū)域,稱為offset。不同類型的指針只能在其特定地址區(qū)域內(nèi)進(jìn)行執(zhí)行,子類覆蓋父類時(shí)會(huì)保證其訪問地址區(qū)域的一致性,從而解決了不同的類型訪問具有不同的訪問權(quán)限問題。2.執(zhí)行就近原則:對(duì)于同名字段或者方法,編譯器是按照其順序查找來引用的,也就是首先訪問離它創(chuàng)建最近的字段或者方法,例如上例中的bird2,是Bird類型,因此會(huì)首先訪問Bird_type(注意編譯器是不會(huì)重新命名的,在此是為區(qū)分起見),如果type類
10、型設(shè)為public,則在此將返回Bird值。這也就是為什么在對(duì)象創(chuàng)建時(shí)必須將字段按順序排列,而父類要先于子類編譯的原因了。封裝:在面向?qū)ο笕刂校庋b特性為程序設(shè)計(jì)提供了系統(tǒng)與系統(tǒng)、模塊與模塊、類與類之間交互的實(shí)現(xiàn)手段。封裝隱藏了類內(nèi)部的具體實(shí)現(xiàn)細(xì)節(jié),對(duì)外則提供統(tǒng)一訪問接口,來操作內(nèi)部數(shù)據(jù)成員。這樣實(shí)現(xiàn)的好處是實(shí)現(xiàn)了UI分離,程序員不需要知道類內(nèi)部的具體實(shí)現(xiàn),只需按照接口協(xié)議進(jìn)行控制即可。同時(shí)對(duì)類內(nèi)部來說,封裝保證了類內(nèi)部成員的安全性和可靠性。字段,屬性,方法通常系統(tǒng)需求描述的核心名詞,可以抽象為類,而對(duì)這些名詞驅(qū)動(dòng)的動(dòng)作,可以對(duì)應(yīng)地抽象為方法。當(dāng)然,具體的設(shè)計(jì)思路要根據(jù)具體的需求情況,在整
11、體架構(gòu)目標(biāo)的基礎(chǔ)上進(jìn)行有效的篩選、剝離和抽象。取舍之間,彰顯OO智慧與設(shè)計(jì)模式的魅力。字段(field)通常定義為private,表示類的狀態(tài)信息。封裝的第一個(gè)原則就是:將字段定義為private。封裝原則告訴我們:類的字段信息最好以私有方式提供給類的外部,而不是以公有方式來實(shí)現(xiàn),否則不適當(dāng)?shù)牟僮鲗⒃斐刹槐匾腻e(cuò)誤方式,破壞對(duì)象的狀態(tài)信息,數(shù)據(jù)安全性和可靠性無法保證。屬性(property)通常定義為public,表示類的對(duì)外成員。字段設(shè)置為了private,則需要通過屬性對(duì)外進(jìn)行暴露。編譯器的執(zhí)行邏輯是:如果發(fā)現(xiàn)一個(gè)屬性,并且查看該屬性中實(shí)現(xiàn)了get還是set,就對(duì)應(yīng)地生成get_屬性名、s
12、et_屬性名兩個(gè)方法。因此,我們可以說,屬性的實(shí)質(zhì)其實(shí)就是在編譯時(shí)分別將get和set訪問器實(shí)現(xiàn)為對(duì)外方法,從而達(dá)到控制屬性的目的,而對(duì)屬性的讀寫行為伴隨的實(shí)際是一個(gè)相應(yīng)方法的調(diào)用,它以一種簡單的形式實(shí)現(xiàn)了方法。通過對(duì)公共屬性的訪問來實(shí)現(xiàn)對(duì)類狀態(tài)信息的讀寫控制,主要有兩點(diǎn)好處:一是避免了對(duì)數(shù)據(jù)安全的訪問限制,包含內(nèi)部數(shù)據(jù)的可靠性;二是避免了類擴(kuò)展或者修改帶來的變量連鎖反應(yīng)。還有一種含參屬性,在C#中稱為索引器(indexer),對(duì)CLR來說并沒有含不含參數(shù)的區(qū)別,它只是負(fù)責(zé)將相應(yīng)的訪問器實(shí)現(xiàn)為對(duì)應(yīng)的方法,不同的是含參屬性中加入了對(duì)參數(shù)的處理過程罷了。方法(method)封裝了類的行為,提供了類
13、的對(duì)外表現(xiàn)。用于將封裝的內(nèi)部細(xì)節(jié)以公有方法提供對(duì)外接口,從而實(shí)現(xiàn)與外部的交互與響應(yīng)。從上面屬性的分析我們可知,實(shí)際上對(duì)屬性的讀寫就是通過方法來實(shí)現(xiàn)的。因此,對(duì)外交互的方法,通常實(shí)現(xiàn)為public。多態(tài)分類:根據(jù)其實(shí)現(xiàn)的方式我們可以進(jìn)一步分為基類繼承式多態(tài)和接口實(shí)現(xiàn)式多態(tài)。運(yùn)行機(jī)制:從技術(shù)實(shí)現(xiàn)角度來看,是.NET的動(dòng)態(tài)綁定機(jī)制成就了面向?qū)ο蟮亩鄳B(tài)特性。動(dòng)態(tài)綁定,又叫晚期綁定,是區(qū)別與靜態(tài)綁定而言的。靜態(tài)綁定在編譯期就可以確定關(guān)聯(lián),一般是以方法重載來實(shí)現(xiàn)的;而動(dòng)態(tài)綁定則在運(yùn)行期通過檢查虛擬方法表來確定動(dòng)態(tài)關(guān)聯(lián)覆寫的方法,一般以繼承和虛方法來實(shí)現(xiàn)。嚴(yán)格來講,.NET中并不存在靜態(tài)綁定。所有的.NET
14、源文件都首先被編譯為IL代碼和元數(shù)據(jù),在方法執(zhí)行時(shí),IL代碼才被JIT編譯器即時(shí)轉(zhuǎn)換為本地CPU指令。JIT編譯發(fā)生于運(yùn)行時(shí),因此也就不存在完全在編譯期建立的關(guān)聯(lián)關(guān)系,靜態(tài)綁定的概念也就無從談起。意義:多態(tài)提供了對(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ǔ)就是建立有效的繼承體系,因此繼承和
15、重載是多態(tài)的實(shí)現(xiàn)基礎(chǔ)。接口所謂接口,就是契約,用于規(guī)定一種規(guī)則由大家遵守。所以,x.publishTime,.NET中很多的接口都以able為命名后綴,例如INullable、ICloneable、IEnumerable、IComparable等,意指能夠?yàn)榭?、能夠克隆、能夠枚舉、能夠?qū)Ρ?,其?shí)正是對(duì)契約的一種遵守寓意,只有實(shí)現(xiàn)了ICloneable接口的類型,才允許其實(shí)例對(duì)象被拷貝。面向接口編程就意味著,在自定義類中想要有某種特性,就必須遵守這種契約。interface IDriveablevoid Drive();public class BusDriver:IDriveablepubli
16、c void Drive()Console.WriteLine(有經(jīng)驗(yàn)的司機(jī)可以駕駛公共汽車。);同樣例如要使用foreach語句迭代,其前提是操作類型必須實(shí)現(xiàn)IEnumerable接口,這也是一種契約。實(shí)現(xiàn)接口還意味著,同樣的方法對(duì)不同的對(duì)象表現(xiàn)為不同的行為。本質(zhì):因此接口其實(shí)本質(zhì)上可以看作是一個(gè)定義了抽象方法的類,該類僅提供了方法的定義,而沒有方法的實(shí)現(xiàn),其功能由接口的實(shí)現(xiàn)類來完成。另外,按照接口隔離原則,接口應(yīng)該被實(shí)現(xiàn)為具有單一功能的多個(gè)小接口,而不是具有多個(gè)功能的大接口。通過多個(gè)接口的不同組合,客戶端按需實(shí)現(xiàn)不同的接口,從而避免出現(xiàn)接口污染的問題。關(guān)于接口的規(guī)則,可以有以下的歸納:接口
17、隔離原則強(qiáng)調(diào)接口應(yīng)該被實(shí)現(xiàn)為具有單一功能的小接口,而不要實(shí)現(xiàn)為具有多個(gè)功能的胖接口,類對(duì)于類的依賴應(yīng)建立在最小的接口之上。接口支持多繼承,既可以作用于值類型,也可以作用于引用類型。禁止為已經(jīng)發(fā)布的接口,添加新的成員,這意味著你必須重新修改所有實(shí)現(xiàn)了該接口的類型,在實(shí)際的應(yīng)用中,這往往是不可能完成的事情。接口不能被實(shí)例化,沒有構(gòu)造函數(shù),接口成員被隱式聲明為public。接口可以作用于值類型和引用類型,并且支持多繼承。.NET開發(fā)性能優(yōu)化條款:1.資源的釋放:推薦以Dispose模式來代替Finalize方式。2.選擇合適的垃圾收集器:工作站GC和服務(wù)期GC。3.在適當(dāng)?shù)那闆r下對(duì)對(duì)象實(shí)現(xiàn)弱引用。弱
18、引用是對(duì)象引用的一種中間態(tài),實(shí)現(xiàn)了對(duì)象既可以通過GC回收其內(nèi)存,又可被應(yīng)用程序訪問的機(jī)制。在.NET中,WeakReference類用于表示弱引用,通過其Target屬性來表示要追蹤的對(duì)象,通過其值賦給變量來創(chuàng)建目標(biāo)對(duì)象的強(qiáng)引用.4.盡可能以u(píng)sing來執(zhí)行資源清理。5.推薦使用泛型集合來代替非泛型集合。6.初始化時(shí)最好為集合對(duì)象指定大小。7.特定類型的Array性能優(yōu)于ArrayList。8.字符串駐留機(jī)制,是CLR為String類型實(shí)現(xiàn)的特殊設(shè)計(jì)。String類型無疑是程序設(shè)計(jì)中使用最頻繁、應(yīng)用最廣泛的基元類型,因此CLR在設(shè)計(jì)上為了提升String類型性能考慮,實(shí)現(xiàn)了一種稱為字符串駐留的
19、機(jī)制,從而實(shí)現(xiàn)了相同字符串可能共享內(nèi)存空間。同時(shí),字符串駐留是進(jìn)程級(jí)的,垃圾回收不能釋放CLR內(nèi)部哈希表維護(hù)的字符串對(duì)象,只有進(jìn)程結(jié)束時(shí)才釋放。這些機(jī)制均為String類型的性能提升和內(nèi)存優(yōu)化提供了良好的基礎(chǔ)。9.合理使用System.String和System.Text.StringBuilder。10.盡量在子類中重寫ToString方法。ToString方法是System.Object提供的一個(gè)公有的虛方法,.NET中任何類型都可繼承System.Object類型提供的實(shí)現(xiàn)方法,默認(rèn)為返回類型全路徑名稱。在自定義類或結(jié)構(gòu)中重寫ToString方法,除了可以有效控制輸出結(jié)果,還能在一定程度
20、上減少裝箱操作的發(fā)生。11.for和foreach的選擇。推薦選擇foreach來處理可枚舉集合的循環(huán)結(jié)構(gòu)12.以多線程處理應(yīng)對(duì)系統(tǒng)設(shè)計(jì)。13.盡可能少地拋出異常,禁止將異常處理放在循環(huán)內(nèi)。14.捕獲異常時(shí),catch塊中盡量指定具體的異常篩選器,多個(gè)catch塊應(yīng)該保證異常由特殊到一般的排列順序。15.以is/as模式進(jìn)行類型兼容性檢查。以is來實(shí)現(xiàn)類型判斷,以as實(shí)現(xiàn)安全的類型轉(zhuǎn)換,這種態(tài)度,是值得推薦的方法。16.const和static readonly的權(quán)衡。const是編譯時(shí)常量,readonly是運(yùn)行時(shí)常量,所以const高效,readonly靈活。在實(shí)際的應(yīng)用中,推薦以stat
21、ic readonly來代替const,以解決const可能引起的程序集引用不一致問題,還有帶來的較多靈活性控制。17.盡量避免不當(dāng)?shù)难b箱和拆箱,選擇合適的代替方案。18.盡量使用一維零基數(shù)組。19.CLR對(duì)一維零基數(shù)組使用了特殊的IL操作指令newarr,在訪問數(shù)組時(shí)不需要通過索引減去偏移量來完成,而且JIT也只需執(zhí)行一次范圍檢查,可以大大提升訪問性能20.以FxCop工具,檢查你的代碼。FxCop是微軟開發(fā)的一個(gè)針對(duì).NET托管環(huán)境的代碼分析工具new關(guān)鍵字深入淺出作為運(yùn)算符,用于創(chuàng)建對(duì)象和調(diào)用構(gòu)造函數(shù)。作為修飾符,用于向基類成員隱藏繼承成員。作為約束,用于在泛型聲明中約束可能用作類型參數(shù)
22、的參數(shù)的類型。MSDN中的定義是:new約束指定泛型類聲明中的任何類型參數(shù)都必須有公共的無參數(shù)構(gòu)造函數(shù)。當(dāng)泛型類創(chuàng)建類型的新實(shí)例時(shí),將此約束應(yīng)用于類型參數(shù)。base關(guān)鍵字其用于在派生類中實(shí)現(xiàn)對(duì)基類公有或者受保護(hù)成員的訪問,但是只局限在構(gòu)造函數(shù)、實(shí)例方法和實(shí)例屬性訪問器中,MSDN中小結(jié)的具體功能包括:調(diào)用基類上已被其他方法重寫的方法,婷婷五月。指定創(chuàng)建派生類實(shí)例時(shí)應(yīng)調(diào)用的基類構(gòu)造函數(shù)。this關(guān)鍵字其用于引用類的當(dāng)前實(shí)例,也包括繼承而來的方法,通常可以隱藏this,MSDN中的小結(jié)功能主要包括:限定被相似的名稱隱藏的成員將對(duì)象作為參數(shù)傳遞到其他方法聲明索引器class和struct相關(guān)1.cl
23、ass是引用類型,繼承自System.Object類;struct是值類型,繼承自System.ValueType類,因此不具多態(tài)性。但是注意,System.ValueType是個(gè)引用類型。2.從職能觀點(diǎn)來看,class表現(xiàn)為行為;而struct常用于存儲(chǔ)數(shù)據(jù)。3.class支持繼承,可以繼承自類和接口;而struct沒有繼承性,struct不能從class繼承,也不能作為class的基類,但struct支持接口繼承4.class可以聲明無參構(gòu)造函數(shù),可以聲明析構(gòu)函數(shù);而struct只能聲明帶參數(shù)構(gòu)造函數(shù),且不能聲明析構(gòu)函數(shù)。因此,struct沒有自定義的默認(rèn)無參構(gòu)造函數(shù),默認(rèn)無參構(gòu)造器只是簡
24、單地把所有值初始化為它們的0等價(jià)值5.實(shí)例化時(shí),class要使用new關(guān)鍵字;而struct可以不使用new關(guān)鍵字,如果不以new來實(shí)例化struct,則其所有的字段將處于未分配狀態(tài),直到所有字段完成初始化,否則引用未賦值的字段會(huì)導(dǎo)致編譯錯(cuò)誤。6.class可以實(shí)抽象類(abstract),可以聲明抽象函數(shù);而struct為抽象,也不能聲明抽象函數(shù)。7.class可以聲明protected成員、virtual成員、sealed成員和override成員;而struct不可以,但是值得注意的是,struct可以重載System.Object的3個(gè)虛方法,Equals()、ToString()和G
25、etHashTable()。8.class的對(duì)象復(fù)制分為淺拷貝和深拷貝(該主題我們?cè)诒鞠盗幸院蟮闹黝}中將重點(diǎn)講述,本文不作詳述),必須經(jīng)過特別的方法來完成復(fù)制;而struct創(chuàng)建的對(duì)象復(fù)制簡單,可以直接以等號(hào)連接即可。9.class實(shí)例由垃圾回收機(jī)制來保證內(nèi)存的回收處理;而struct變量使用完后立即自動(dòng)解除內(nèi)存分配。10.作為參數(shù)傳遞時(shí),class變量是以按址方式傳遞;而struct變量是以按值方式傳遞的。接口和抽象類的區(qū)別:1接口支持多繼承;抽象類不能實(shí)現(xiàn)多繼承。2接口只能定義抽象規(guī)則;抽象類既可以定義規(guī)則,還可能提供已實(shí)現(xiàn)的成員。3接口是一組行為規(guī)范;抽象類是一個(gè)不完全的類,著重族的概念
26、。4接口可以用于支持回調(diào);抽象類不能實(shí)現(xiàn)回調(diào),因?yàn)槔^承不支持。5接口只包含方法、屬性、索引器、事件的簽名,但不能定義字段和包含實(shí)現(xiàn)的方法;抽象類可以定義字段、屬性、包含有實(shí)現(xiàn)的方法,在線簽名設(shè)計(jì)免費(fèi)。6接口可以作用于值類型和引用類型;抽象類只能作用于引用類型。例如,Struct就可以繼承接口,而不能繼承類。接口和抽象類適用的場合:1抽象類應(yīng)主要用于關(guān)系密切的對(duì)象,而接口最適合為不相關(guān)的類提供通用功能。2接口著重于CAN-DO關(guān)系類型,而抽象類則偏重于IS-A式的關(guān)系;3接口多定義對(duì)象的行為;抽象類多定義對(duì)象的屬性;4接口定義可以使用public、protected、internal和priva
27、te修飾符,但是幾乎所有的接口都定義為public,原因就不必多說了。5接口不變,是應(yīng)該考慮的重要因素。所以,在由接口增加擴(kuò)展時(shí),應(yīng)該增加新的接口,而不能更改現(xiàn)有接口。6盡量將接口設(shè)計(jì)成功能單一的功能塊,以.NET Framework為例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一個(gè)公共方法。7接口名稱前面的大寫字母I是一個(gè)約定,正如字段名以下劃線開頭一樣,請(qǐng)堅(jiān)持這些原則。8在接口中,所有的方法都默認(rèn)為public。9如果預(yù)計(jì)會(huì)出現(xiàn)版本問題,可以創(chuàng)建抽象類。例如,創(chuàng)建了狗(Dog)、雞(Chicken)和鴨(
28、Duck),那么應(yīng)該考慮抽象出動(dòng)物(Animal)來應(yīng)對(duì)以后可能出現(xiàn)風(fēng)馬牛的事情。而向接口中添加新成員則會(huì)強(qiáng)制要求修改所有派生類,并重新編譯,所以版本式的問題最好以抽象類來實(shí)現(xiàn)。10從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實(shí)實(shí)現(xiàn)。11對(duì)抽象類不能使用new關(guān)鍵字,也不能被密封,原因是抽象類不能被實(shí)例化。12在抽象方法聲明中不能使用static或virtual修飾符。System.Object System.Object是所有類型的基類,任何類型都直接或間接繼承自System.Object類。沒有指定基類的類型都默認(rèn)繼承于System.Object,從而具有Object的基
29、本特性,這些特性主要包括:通過GetType方法,獲取對(duì)象類型信息。通過Equals、ReferenceEquals和=,實(shí)現(xiàn)對(duì)象判等。通過ToString方法,獲取對(duì)象字符串信息,默認(rèn)返回對(duì)象類型全名。通過MemberwiseClone方法,實(shí)現(xiàn)對(duì)象實(shí)例的淺拷貝。通過GetHashCode方法,獲取對(duì)象的值的散列碼。通過Finalize方法,在垃圾回收時(shí)進(jìn)行資源清理。委托,事件,匿名方法,Lambda表達(dá)式委托本質(zhì)上仍舊是一個(gè)類,該類繼承自System.MulticastDelegate類,該類維護(hù)一個(gè)帶有鏈接的委托列表,在調(diào)用多播委托時(shí),將按照委托列表的委托順序而調(diào)用的。還包括一個(gè)接受兩個(gè)
30、參數(shù)的構(gòu)造函數(shù)和3個(gè)重要方法:BeginInvoke、EndInvoke和Invoke。委托的構(gòu)造函數(shù)中包括了兩個(gè)參數(shù):第一個(gè)參數(shù)表示一個(gè)對(duì)象引用,它指向了當(dāng)前委托調(diào)用回調(diào)函數(shù)的實(shí)例,第二個(gè)參數(shù)標(biāo)識(shí)了回調(diào)方法。創(chuàng)建完實(shí)例化對(duì)象都后,通過Invoke執(zhí)行回調(diào)方法調(diào)用,可見真正執(zhí)行調(diào)用的是Invoke方法。.NET的事件模型建立在委托機(jī)制之上,透徹的了解了委托才能明白的分析事件??梢哉f,事件是對(duì)委托的封裝,從委托的示例中可知,在客戶端可以隨意對(duì)委托進(jìn)行操作,多人聊天室,一定程度上破壞了面向的對(duì)象的封裝機(jī)制,因此事件實(shí)現(xiàn)了對(duì)委托的封裝。完整定義過程:定義一個(gè)內(nèi)部事件參數(shù)類型,用于存放事件引發(fā)時(shí)向事件處理程序傳遞的狀態(tài)信息,EventArgs是事件數(shù)據(jù)類的基類。聲明事件委托,主要包括兩個(gè)參數(shù):一個(gè)表示事件發(fā)送者對(duì)象,一個(gè)表示事件參數(shù)類對(duì)象。定義事件成員。定義負(fù)責(zé)通知事件引發(fā)的方法,它被實(shí)現(xiàn)為protected virtual方法,目的是可以在派生類中覆寫該方法來拒絕監(jiān)視事件。定義一個(gè)觸發(fā)事件的方法,例如Calculate被調(diào)用時(shí),表示有新的計(jì)算發(fā)生。匿名方法以內(nèi)聯(lián)方式放入委托對(duì)象的使用位置,而避免創(chuàng)建一個(gè)委托來關(guān)聯(lián)回調(diào)方法,也就
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024蝦池承包養(yǎng)殖與現(xiàn)代農(nóng)業(yè)裝備租賃合同3篇
- 2024木地板購銷及安裝合同
- 2025年度體育公園場地租賃及健身服務(wù)合同3篇
- 2025年度CEO任期目標(biāo)管理與服務(wù)合同范本3篇
- 2025年4S店汽車銷售合同(含新能源補(bǔ)貼申請(qǐng)服務(wù))3篇
- 2024電梯全年保養(yǎng)合作協(xié)議樣本版B版
- 2024離婚后子女撫養(yǎng)權(quán)與探視權(quán)合同
- 《神創(chuàng)論VS進(jìn)化論》課件
- 2024補(bǔ)充協(xié)議:加工承攬合同的物料供應(yīng)與質(zhì)量標(biāo)準(zhǔn)
- 2024電商企業(yè)知識(shí)產(chǎn)權(quán)許可合同6篇
- 浙江省金華市婺城區(qū)2024-2025學(xué)年九年級(jí)上學(xué)期期末數(shù)學(xué)試卷(含答案)
- 天津市河西區(qū)2024-2025學(xué)年高二上學(xué)期1月期末英語試題(含答案無聽力音頻及聽力原文)
- 2025屆高考語文復(fù)習(xí):信息類文本五大類型的主觀題 課件
- 重慶市2023-2024學(xué)年七年級(jí)上學(xué)期期末考試數(shù)學(xué)試題(含答案)
- 安徽省合肥市蜀山區(qū)2023-2024學(xué)年五年級(jí)上學(xué)期期末質(zhì)量檢測科學(xué)試題
- 高數(shù)(大一上)期末試題及答案
- 員工工資條模板
- 14K118 空調(diào)通風(fēng)管道的加固
- 常見浮游植物圖譜(1)
- 丙酮-水連續(xù)精餾塔的設(shè)計(jì)
- 菜鳥也上手:最最完整的Cool Edit Pro 圖文操作手冊(cè)
評(píng)論
0/150
提交評(píng)論