天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

《Effective C#中文版:改善C#程序的50種方法》讀書(shū)筆記

  從去年找工作以來(lái),都沒(méi)什么時(shí)間寫(xiě)博客[找工作的體會(huì):建議以后有自己開(kāi)公司的IT人一定要找IT專業(yè)人員做HR,好多公司的HR并不能真正發(fā)掘人才,他們形成了太多的偏見(jiàn),如在學(xué)校期間學(xué)不了什么東西、只看學(xué)校有多少獎(jiǎng)勵(lì)等。真正鉆研技術(shù)的人才不會(huì)追求虛無(wú)的東西],其實(shí)這本書(shū)我都借了好久,一直沒(méi)有系統(tǒng)的看,所以趁這兩天好好看看,順便總結(jié)了一些要點(diǎn),給那些需要這方面知識(shí)而又沒(méi)有太多時(shí)間的IT人一個(gè)快速的學(xué)習(xí)機(jī)會(huì)。。。。如果要深入學(xué)習(xí),請(qǐng)購(gòu)買(mǎi)該書(shū)。

  一、用屬性代替可訪問(wèn)的字段

  1、.NET數(shù)據(jù)綁定只支持?jǐn)?shù)據(jù)綁定,使用屬性可以獲得數(shù)據(jù)綁定的好處;

  2、在屬性的get和set訪問(wèn)器重可使用lock添加多線程的支持。

  二、readonly(運(yùn)行時(shí)常量)和const(編譯時(shí)常量)

  1、const只可用于基元類型、枚舉、字符串,而readonly則可以是任何的類型;

  2、const在編譯時(shí)將替換成具體的常量,這樣如果在引用中同時(shí)使用了const和readonly兩種值,則對(duì)readonly的再次改變將會(huì)改變?cè)O(shè)計(jì)的初衷,這是需要重新編譯所更改的程序集,以重新引用新的常量值。

  3、const比readonly效率高,但失去了應(yīng)用的靈活性。

  三、is與as

  1、兩者都是在運(yùn)行時(shí)進(jìn)行類型的轉(zhuǎn)換,as操作符只能使用在引用類型,而is可以使用值和引用類型;

  2、通常的做法是用is判斷類型,然后選擇使用as或強(qiáng)類型轉(zhuǎn)換操作符(用operater定義的轉(zhuǎn)換)有選擇地進(jìn)行。

  四、ConditionalAttribute代替#if #endif條件編譯

  1、ConditionalAttribute只用于方法級(jí),對(duì)其他的如類型、屬性等的添加都是無(wú)效的;而#if #endif則不受此限制;

  2、ConditionalAttribute可以添加多個(gè)編譯條件的或(OR)操作,而#if #endif則可以添加與(AND)[這里可以完全定義為另一個(gè)單獨(dú)的符號(hào)];

  3、ConditioanlAttribute定義可以放在一個(gè)單獨(dú)的方法中,使得程序更為靈活。

  五、提供ToString()方法

  1、可以更友好的方式提供用戶詳細(xì)的信息;

  2、使用IFormatter.ToString()方法提供更靈活的定制,如果添加IFormatProvider 和ICustomFormatter接口則更有意義的定制消息輸出。

  六、值和引用類型的區(qū)別

  1、值類型不支持多態(tài),適合存儲(chǔ)應(yīng)用程序操作的數(shù)據(jù),而引用則支持多態(tài),適用于定義應(yīng)用程序的行為;

  2、對(duì)于數(shù)組定義為值類型可以顯著提高程序的性能;

  3、值類型具有較少的堆內(nèi)存碎片、內(nèi)存垃圾和間接訪問(wèn)時(shí)間,其在方法中的返回是以復(fù)制的方式進(jìn)行,避免暴露內(nèi)部結(jié)構(gòu)到外界;

  4、值類型應(yīng)用在如下的場(chǎng)景中:類型的職責(zé)主要是用于數(shù)據(jù)存儲(chǔ);公共接口完全由一些數(shù)據(jù)成員存取屬性定義;永遠(yuǎn)沒(méi)有子類;永遠(yuǎn)沒(méi)有多態(tài)行為。

  七、值類型盡可能實(shí)現(xiàn)為常量性和原子性的類型

  1、使我們的代碼更易于編寫(xiě)和維護(hù);

  2、初始化常量的三種策略:在構(gòu)造中;工廠方法;構(gòu)造一個(gè)可變的輔助類(如StringBuilder)。

  八、確保0為值得有效狀態(tài)

  1、值類型的默認(rèn)狀態(tài)應(yīng)為0;

  2、枚舉類型的0不應(yīng)為無(wú)效的狀態(tài);在FlagsAttribute是應(yīng)確保0值為有效地狀態(tài);

  3、在字符串為為空時(shí)可以返回一個(gè)string.Empty的空字符串。

  九、相等判斷的多種表示關(guān)系

  1、ReferenceEquals()判斷引用相等,需要兩個(gè)是引用同一個(gè)對(duì)象時(shí)方可返回true;

  2、靜態(tài)的Equals()方法先進(jìn)行引用判斷,再進(jìn)行值類型判斷的;

  3、對(duì)于引用類型的判斷可以在使用值語(yǔ)義時(shí)使用重寫(xiě)Equals()方法;

  4、重寫(xiě)Equals()方法時(shí)也應(yīng)當(dāng)重寫(xiě)GetHashCode()方法,同時(shí)提供operater==()操作。

  十、理解GetHashCode()方法的缺陷

  1、GetHashCode()僅應(yīng)用在基于散列的集合定義鍵的散列值,如HashTable或Dictionary;

  2、GetHashCode()應(yīng)當(dāng)遵循相應(yīng)的三條規(guī)則:兩個(gè)相等對(duì)象應(yīng)當(dāng)返回相同的散列碼;應(yīng)當(dāng)是一個(gè)實(shí)例不變式;散列函數(shù)應(yīng)該在所有的整數(shù)中產(chǎn)生一個(gè)隨機(jī)的分布。

  十一、優(yōu)先使用foreach循環(huán)語(yǔ)句

  1、foreach可以消除編譯器對(duì)for循環(huán)對(duì)數(shù)組邊界的檢查;

  2、foreach的循環(huán)變量是只讀的,且存在一個(gè)顯式的轉(zhuǎn)換,在集合對(duì)象的對(duì)象類型不正確時(shí)拋出異常;

  3、foreach使用的集合需要有:具備公有的GetEnumberator()方法;顯式實(shí)現(xiàn)了IEnumberable接口;實(shí)現(xiàn)了IEnumerator接口;

  4、foreach可以帶來(lái)資源管理的好處,因?yàn)槿绻幾g器可以確定IDisposable接口時(shí),可以使用優(yōu)化的try…finally塊;

  十二、默認(rèn)字段的初始化優(yōu)于賦值語(yǔ)句

  1、字段生命默認(rèn)會(huì)將值類型初始化為0,引用類型初始化為null;

  2、對(duì)同一個(gè)對(duì)象進(jìn)行多次初始化會(huì)降低代碼的執(zhí)行效率;

  3、將字段的初始化放到構(gòu)造器中有利于進(jìn)行異常處理。

  十三、使用靜態(tài)構(gòu)造器初始化靜態(tài)成員

  1、靜態(tài)構(gòu)造器會(huì)在一個(gè)類的任何方法、變量或者屬性訪問(wèn)之前執(zhí)行;

  2、靜態(tài)字段同樣會(huì)在靜態(tài)構(gòu)造器之前運(yùn)行,同時(shí)靜態(tài)構(gòu)造器有利于異常處理。

  十四、利用構(gòu)造器鏈(在.NET 4.0已經(jīng)用可選參數(shù)解決了這個(gè)問(wèn)題)

  1、用this將初始化工作交給另一個(gè)構(gòu)造器,用base調(diào)用基類的構(gòu)造器;

  2、類型實(shí)例的操作順序是:將所有的靜態(tài)字段都設(shè)置為0;執(zhí)行靜態(tài)字段初始化器;執(zhí)行基類的靜態(tài)構(gòu)造器;執(zhí)行當(dāng)前類型的靜態(tài)構(gòu)造器;

  將所有的實(shí)例字段設(shè)置為0;執(zhí)行實(shí)例字段初始化器;執(zhí)行合適的基類實(shí)例構(gòu)造器;執(zhí)行當(dāng)前類型的實(shí)例構(gòu)造器。

  十五、利用using和try/finally語(yǔ)句來(lái)清理資源

  在IDisposable接口的Dispose()方法中用GC.SuppressFinalize()可通知垃圾收集器不再執(zhí)行終結(jié)操作。

  十六、盡量減少內(nèi)存垃圾

  1、分配和銷(xiāo)毀一個(gè)堆上的對(duì)象都要花費(fèi)額外的處理器時(shí)間;

  2、減少分配對(duì)象數(shù)量的技巧:經(jīng)常使用的局部變量提升為字段;提供一個(gè)類,用于存儲(chǔ)Singleton對(duì)象來(lái)表達(dá)特定類型的常用實(shí)例。

  3、用StringBuilder進(jìn)行復(fù)雜的字符串操作。

  十七、盡量減少裝箱和拆箱

  1、關(guān)注一個(gè)類型到System.Object的隱式轉(zhuǎn)換,同時(shí)值類型不應(yīng)該被替換為System.Object類型;

  2、使用接口而不是使用類型可以避免裝箱,即將值類型從接口實(shí)現(xiàn),然后通過(guò)接口調(diào)用成員。

  十八、實(shí)現(xiàn)標(biāo)準(zhǔn)Dispose模式

  1、使用非內(nèi)存資源,它必須有一個(gè)終結(jié)器,垃圾收集器在完成沒(méi)有終結(jié)其的內(nèi)存對(duì)象后,會(huì)將實(shí)現(xiàn)了終結(jié)器對(duì)象的添加到終結(jié)隊(duì)列中,然后垃圾收集器會(huì)啟動(dòng)一個(gè)新的線程來(lái)運(yùn)行這些對(duì)象上的終結(jié)器,這種防御性的變成方式是因?yàn)槿绻脩敉浟苏{(diào)用Dispose()方法,垃圾回收器總是會(huì)調(diào)用終結(jié)器方法的,這樣可以避免出現(xiàn)非托管的內(nèi)存資源不被釋放引起內(nèi)存泄漏的問(wèn)題;

  2、使用IDisposable.Dispose()方法需要做四個(gè)方面的工作:釋放所有的非托管資源;釋放所有的托管資源;設(shè)置一個(gè)狀態(tài)標(biāo)記來(lái)表示是否已經(jīng)執(zhí)行了Dispose();調(diào)用GC.SuppressFinalize(this)取消對(duì)象的終結(jié)操作;

  3、為需要多態(tài)的類型添加一個(gè)受保護(hù)的虛方法Dispose(),派生類通過(guò)重寫(xiě)這個(gè)方法來(lái)釋放自己的任務(wù);

  4、在需要IDisoposable接口的類型中,即使我們不需要一個(gè)終結(jié)器也應(yīng)該實(shí)現(xiàn)一個(gè)終結(jié)器。

  十九、定義并實(shí)現(xiàn)接口優(yōu)于繼承類型

  1、不相關(guān)的類型可以共同實(shí)現(xiàn)一個(gè)共同的接口,而且實(shí)現(xiàn)接口比繼承更容易;

  2、接口比較穩(wěn)定,他將一組功能封裝在一個(gè)接口中,作為其他類型的實(shí)現(xiàn)合同,而基類則可以隨著時(shí)間的推移進(jìn)行擴(kuò)展。

  二十、明辨接口實(shí)現(xiàn)和虛方法重寫(xiě)

  1、在基類中實(shí)現(xiàn)一個(gè)接口時(shí),派生類需要使用new來(lái)隱藏對(duì)基類方法的使用;

  2、可以將基類接口的方法申明為虛方法,然后再派生類中實(shí)現(xiàn)。

  二十一、使用委托表達(dá)回調(diào)

  1、委托對(duì)象本身不提供任何異常捕獲,所以任何的多播委托調(diào)用都會(huì)結(jié)束整個(gè)調(diào)用鏈;

  2、通過(guò)顯示調(diào)用委托鏈上的每個(gè)委托目標(biāo)可以避免多播委托僅返回最后一個(gè)委托的輸出。

  二十二、使用事件定義外部接口

  1、應(yīng)當(dāng)聲明為共有的事件,讓編譯器為我們創(chuàng)建add和renmove方法;

  2、使用System.ComponentModel.EventHandlerList容器來(lái)存儲(chǔ)各個(gè)事件處理器,在類型中包含大量事件時(shí)可以使用他來(lái)隱藏所有事件的復(fù)雜性。

  二十三、避免返回內(nèi)部類對(duì)象的引用

  1、由于值類型對(duì)象的訪問(wèn)會(huì)創(chuàng)建一個(gè)該對(duì)象的副本,所以定義一個(gè)值類型的的屬性完全不會(huì)改變類型對(duì)象內(nèi)部的狀態(tài);

  2、常量類型可以避免改變對(duì)象的狀態(tài);

  3、定義接口將訪問(wèn)限制在一個(gè)子集中從而最小化對(duì)對(duì)象內(nèi)部狀態(tài)的破壞;

  4、定義一個(gè)包裝器對(duì)象來(lái)限制另一個(gè)對(duì)象的訪問(wèn);

  5、希望客戶代碼更改內(nèi)部數(shù)據(jù)元素時(shí)可以實(shí)現(xiàn)Observer模式,以使對(duì)象可以對(duì)更改進(jìn)行校驗(yàn)或相應(yīng)。

  二十四、聲明式編程優(yōu)于命令式編程

  可以避免在多個(gè)類似的手工編寫(xiě)的算法中犯錯(cuò)誤的可能性,并提供清晰和可讀的代碼。

  二十五、盡可能將類型實(shí)現(xiàn)為可序列化的類型

  1、類型表示的不是UI控件、窗口或者表單,都應(yīng)使類型支持序列化;

  2、在添加了NonSerializedAttribute的反序列化的屬性時(shí)可以通過(guò)實(shí)現(xiàn)IDeserializationCallback的OnDeserialization()方法裝入默認(rèn)值;

  3、在版本控制中可以使用ISerializable接口來(lái)進(jìn)行靈活的控制,同時(shí)提供一個(gè)序列化的構(gòu)造器來(lái)根據(jù)流中的數(shù)據(jù)初始化對(duì)象,在實(shí)現(xiàn)時(shí)還要求SerializationFormatter異常的許可;

  4、如果需要?jiǎng)?chuàng)建派生類則需要提供一個(gè)掛鉤方法供派生類使用。

  二十六、使用IComparable和IComparer接口實(shí)現(xiàn)排序關(guān)系

  1、IComparable接口用于為類型實(shí)現(xiàn)最自然的排序關(guān)系,重載四個(gè)比較操作符,可以提供一個(gè)重載版的CompareTo()方法,讓其接受具體類型作為參數(shù);

  2、IComparer用于提供有別于IComparable的排序關(guān)系,或者為我們提供類型本身說(shuō)沒(méi)有實(shí)現(xiàn)的排序關(guān)系。

  二十七、避免ICloneable接口

  1、對(duì)于值類型永遠(yuǎn)不需要支持ICloneable接口,使用默認(rèn)的賦值操作即可;

  2、對(duì)于可能需要支持ICloneable接口的基類,應(yīng)該為其創(chuàng)造一個(gè)受保護(hù)的復(fù)制構(gòu)造器,并應(yīng)當(dāng)避免支持IConeable接口。

  二十八、避免強(qiáng)制轉(zhuǎn)換操作符

  通過(guò)使用構(gòu)造器來(lái)代替轉(zhuǎn)換操作符可以使轉(zhuǎn)換工作變得更清晰,由于在轉(zhuǎn)換后使用的臨時(shí)對(duì)象,容易導(dǎo)致一些詭異的BUG。

  二十九、只有當(dāng)新版積累導(dǎo)致問(wèn)題時(shí)才考慮使用new修飾符

  三十、盡可能實(shí)現(xiàn)CLS兼容的程序集

  1、創(chuàng)建一個(gè)兼容的程序集需要遵循兩條規(guī)則:程序集中所有公有和受保護(hù)成員所使用的參數(shù)和返回值類型都必須與CLS兼容;任何與CLS不兼容的公有和受保護(hù)成員都必須有一個(gè)與CLS兼容的替代品;

  2、可以通過(guò)顯式實(shí)現(xiàn)接口來(lái)避開(kāi)CLS兼容類型檢查,及CLSCompliantAttribute不會(huì)檢查私有的成員的CLS兼容性。

  三十一、盡可能實(shí)現(xiàn)短小簡(jiǎn)潔的方法

  1、JIT編譯器以方法為單位進(jìn)行編譯,沒(méi)有被調(diào)用的方法不會(huì)被JIT編譯;

  2、如果將較長(zhǎng)的Switch中的Case語(yǔ)句的代碼替換成一個(gè)一個(gè)的方法,則JIT編譯器所節(jié)省的時(shí)間將成倍增加;

  3、短小精悍的方法并選擇較少的局部變量可以獲得優(yōu)化的寄存器使用;

  4、方法內(nèi)的控制分支越少,JIT編譯器越容易將變量放入寄存器。

  三十二、盡可能實(shí)現(xiàn)小尺寸、高內(nèi)聚的程序集

  1、將所有的公有類以及共用的基類放到一些程序集中,把為公有類提供功能的工具類也放入同樣的程序集中,把相關(guān)的公有接口打包到他們自己的程序集中,最后處理遍布應(yīng)用程序中水平位置的類;

  2、原則上創(chuàng)建兩種組件:一種為小而聚合、具有某項(xiàng)特定功能的程序集,另一種為大而寬、包含共用功能的程序集。

  三十三、限制類型的可見(jiàn)性

  1、使用接口來(lái)暴露類型的功能,可以使我們更方便地創(chuàng)建內(nèi)部類,同時(shí)又不會(huì)限制他們?cè)诔绦蚣獾目捎眯裕?/p>

  2、向外暴露的公有類型越少,未來(lái)擴(kuò)展和更改實(shí)現(xiàn)所擁有的選擇就越多。

  三十四、創(chuàng)建大粒度的Web API

  這是在機(jī)器之間的交易的頻率和載荷都降到最低,將大的操作和細(xì)粒度的執(zhí)行放到服務(wù)器執(zhí)行。

  三十五、重寫(xiě)優(yōu)于事件處理器

  1、一個(gè)事件處理器拋出異常,則事件鏈上的其他處理器將不會(huì)被調(diào)用,而重寫(xiě)的虛方法則不會(huì)出現(xiàn)這種情況;

  2、重寫(xiě)要比關(guān)聯(lián)事件處理器高效得多,事件處理器需要迭代整個(gè)請(qǐng)求列表,這樣占用了更多的CPU時(shí)間;

  3、事件能在運(yùn)行時(shí)響應(yīng),具有更多的靈活性,可以對(duì)同一個(gè)事件關(guān)聯(lián)多個(gè)響應(yīng);

  4、通行的規(guī)則是處理一個(gè)派生類的事件是,重寫(xiě)方式較好。

  三十六、合理使用.NET運(yùn)行時(shí)診斷

  1、System.Diagnostics.Debug/Trace/EventLog為運(yùn)行時(shí)提供了程序添加診斷信息所需要的所有工具,EventLog提供入口時(shí)的應(yīng)用程序能寫(xiě)到系統(tǒng)事件日志中;

  2、最后不要寫(xiě)自己的診斷庫(kù),.NET FCL 已經(jīng)擁有了我們需要的核心庫(kù)。

  三十七、使用標(biāo)準(zhǔn)配置機(jī)制

  1、.NET框架的System.Windows.Application類為我們定義了建立通用配置路徑的屬性;

  2、Application.LocalAppDataPath 和 Application.userDataPath 會(huì)生成本地?cái)?shù)據(jù)目錄和用戶數(shù)據(jù)的路徑名;

  3、不要在ProgramFiles和Windows系統(tǒng)目錄中寫(xiě)入數(shù)據(jù),這些位置需要更高的安全權(quán)限,不要指望用戶擁有寫(xiě)入的權(quán)限。

  三十八、定制和支持?jǐn)?shù)據(jù)綁定

  1、BindingMananger和CurrencyManager這兩個(gè)對(duì)象實(shí)現(xiàn)了控件和數(shù)據(jù)源之間的數(shù)據(jù)傳輸;

  2、數(shù)據(jù)綁定的優(yōu)勢(shì):使用數(shù)據(jù)綁定要比編寫(xiě)自己的代碼簡(jiǎn)單得多;應(yīng)該將它用于文本數(shù)據(jù)項(xiàng)之外的范圍 —— 其他顯示屬性也可以被綁定;對(duì)于 Windowos Forms 數(shù)據(jù)綁定能夠處理多個(gè)控件同步的檢查相關(guān)數(shù)據(jù)源;

  3、在對(duì)象不支持所需的屬性時(shí),可以通過(guò)屏蔽當(dāng)前的對(duì)象,然后添加一個(gè)想要的對(duì)象來(lái)支持?jǐn)?shù)據(jù)綁定。

  三十九、使用.NET驗(yàn)證

  1、ASP.NET中有五種控件來(lái)驗(yàn)證有效性,可以用CustomValidator派生一個(gè)新類來(lái)增加自己的認(rèn)證器;

  2、Windows驗(yàn)證需要子System.Windows.Forms.Control.Validating寫(xiě)一個(gè)事件處理器。

  四十、根據(jù)需要選用恰當(dāng)?shù)募?/h2>

  1、數(shù)組有兩個(gè)比較明顯的缺陷:不能動(dòng)態(tài)的調(diào)整大小;調(diào)整大小非常耗時(shí);

  2、ArrayList混合了一維數(shù)組和鏈表的特征,Queue和Stack是建立在Array基礎(chǔ)上的特殊數(shù)組;

  3、當(dāng)程序更加靈活的添加和刪除項(xiàng)時(shí),可以使更加健壯的集合類型,當(dāng)創(chuàng)建一個(gè)模擬集合的類時(shí),應(yīng)當(dāng)為其實(shí)現(xiàn)索引器和IEnumberable接口。

  四十一、DataSet優(yōu)于自定義結(jié)構(gòu)

  1、DataSet有兩個(gè)缺點(diǎn)個(gè):使用XML序列化機(jī)制的DataSet與非.NET 代碼之間的交互不是很好;DataSet是一個(gè)非常通用的容器;

  2、強(qiáng)類型的DataSet打破了更多的設(shè)計(jì)規(guī)則,其獲得的開(kāi)發(fā)效率要遠(yuǎn)遠(yuǎn)高于自己編寫(xiě)的看上去更為優(yōu)雅的設(shè)計(jì)。

  四十二、利用特性簡(jiǎn)化反射

  通過(guò)設(shè)計(jì)和實(shí)現(xiàn)特性類,強(qiáng)制開(kāi)發(fā)人員用他們來(lái)聲明可被動(dòng)態(tài)使用的類型、方法和屬性,可以減少應(yīng)用程序的運(yùn)行時(shí)錯(cuò)誤,提高軟件的用戶滿意度。

  四十三、避免過(guò)度使用反射

  1、Invoke成員使用的參數(shù)和返回值都是System.Object,在運(yùn)行時(shí)進(jìn)行類型的轉(zhuǎn)換,但出現(xiàn)問(wèn)題的可能性也變得更多了;

  2、接口使我們可以得到一個(gè)更為清晰、也更具可維護(hù)性的系統(tǒng),反射是一個(gè)很強(qiáng)大的晚期綁定機(jī)制,.NET框架使用它來(lái)實(shí)現(xiàn)Windows控件和Web控件的數(shù)據(jù)綁定。

  四十四、為應(yīng)用程序創(chuàng)建特定的異常類

  1、需要不同的異常類的唯一原因是讓用戶在編寫(xiě)catch處理器時(shí)能夠方便地對(duì)不同的錯(cuò)誤采取不同的做法;

  2、可能有不同的修復(fù)行為時(shí),我們才應(yīng)該創(chuàng)建多種不同的異常類,通過(guò)提供異常基類所支持的所有構(gòu)造器,可以為應(yīng)用程序創(chuàng)建功能完整的異常類,使用InnerException屬性可以保存更低級(jí)別錯(cuò)誤條件所產(chǎn)生的所有錯(cuò)誤信息。

  四十五、優(yōu)先選擇異常安全保證

  1、強(qiáng)異常保證在從異常中恢復(fù)和簡(jiǎn)化異常處理之間提供了最好的平衡,在操作因?yàn)楫惓6袛啵绦虻臓顟B(tài)保留不變;

  2、對(duì)將要修改的數(shù)據(jù)做防御性的復(fù)制,對(duì)這些數(shù)據(jù)的防御性復(fù)制進(jìn)行修改,這中間的操作可能會(huì)引發(fā)異常,將臨時(shí)的副本和原對(duì)象進(jìn)行交換;

  3、終結(jié)器、Dispose()方法和委托對(duì)象所綁定的目標(biāo)方法在任何情況下都應(yīng)當(dāng)確保他們不會(huì)拋出異常。

  四十六、最小化互操作

  1、互操作有三個(gè)方面的代價(jià):數(shù)據(jù)在托管堆和非托管堆之間的列舉成本,托管代碼和非托管代碼之間切換的成本,對(duì)開(kāi)發(fā)人員來(lái)說(shuō)與混合環(huán)境打交道的開(kāi)發(fā)工作;

  2、在interop中使用blittable類型可以有效地在托管和非托管環(huán)境中來(lái)回復(fù)制,而不受對(duì)象內(nèi)部結(jié)構(gòu)的影響;

  3、使用In/Out特性來(lái)確保最貼切的不必要的多次復(fù)制,通過(guò)聲明數(shù)據(jù)如何被列舉來(lái)提高性能;

  4、使用COM Interop用最簡(jiǎn)單的方式實(shí)現(xiàn)和COM組件的互操作,使用P/Invoke調(diào)用Win32 API,或者使用C++編譯器的/CLR開(kāi)關(guān)來(lái)混合托管和非托管的代碼;

  四十七、優(yōu)先選擇安全代碼

  1、盡可能的避免訪問(wèn)非托管內(nèi)存,隔離存儲(chǔ)不能防止來(lái)自托管代碼和受信用戶的訪問(wèn);

  2、程序集在Web上運(yùn)行時(shí)可以考慮使用隔離存儲(chǔ),當(dāng)某些算法確實(shí)需要更高的安全許可時(shí),應(yīng)該將那些代碼隔離在一個(gè)單獨(dú)的程序集中。

  四十八、掌握相關(guān)工具與資源

  1、使用NUnit建立自動(dòng)單元測(cè)試(集成在VS2010 中了);

  2、FXCop工具會(huì)獲取程序集中的IL代碼,并將其與異族編碼規(guī)則和最佳實(shí)踐對(duì)照分析,最后報(bào)告違例情況;

  3、ILDasm是一個(gè)IL反匯編工具,可以幫助我們洞察細(xì)節(jié);

  4、Shared Source CLI是一個(gè)包含.NET框架內(nèi)核和C#編譯器的實(shí)現(xiàn)源碼。

  四十九、為C#2.0做準(zhǔn)備(這個(gè)規(guī)則現(xiàn)在已經(jīng)沒(méi)什么意義了,畢竟現(xiàn)在已經(jīng)到了4.0 )

  五十、了解ECMA標(biāo)準(zhǔn)

NET技術(shù)《Effective C#中文版:改善C#程序的50種方法》讀書(shū)筆記,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 别停好爽好深好大好舒服视频 | 好硬好湿好大再深一点动态图 | 亚洲欧美一区二区三区九九九 | 国产99视频在线观看 | 精品国产乱码久久久久久软件 | 国产精品久久人妻拍拍水牛影视 | 亚洲国产在线视频中文字 | 最近的2019中文字幕国语完整版 | 99久久免费国产精品特黄 | 最新日本免费一区 | 伊人久久综合成人亚洲 | 小SB几天没做SAO死了H | 亚洲免费福利在线视频 | 三级aa久久 | 99re久久热免费视频 | 亚洲国产精品嫩草影院 | 色婷婷粉嫩AV精品综合在线 | 538久久视频在线 | OLDMAN老头456 TUBE | 国产一级毛片在线 | 99精品99 | 扒开腿狂躁女人GIF动态图 | 亚洲AV综合99一二三四区 | 欧美精品专区免费观看 | 久久这里只有精品国产精品99 | 97国产人妻精品无码AV在线 | 无羞耻肉动漫在线观看 | 红杏俱乐部 | 最近中文字幕在线看免费完整版 | 国产精品美女久久久久浪潮AV | 女教师苍井空体肉女教师S242 | 伊人久久国产精品 | 亚洲欧美一区二区三区四区 | 私密按摩师在线观看 百度网盘 | 在线观看免费视频播放视频 | 三级黄色在线视频中文 | 欧美人与动交zOZ0 | 亚洲免费一 | 国产精品九九久久精品视 | 20岁中国男同志china1069 20岁αsrian男同志免费 | 俄罗斯XXXXXL18 |