關於代碼優化的問題,之前也給大家介紹過相關的內容。下面介紹的是C#代碼優化的一些注意事項,供參考。接上一篇>>
二十六、使用IComparable和IComparer接口實現排序關系
1、IComparable接口用於為類型實現最自然的排序關系,重載四個比較操作符,可以提供一個重載版的CompareTo()方法,讓其接受具體類型作為參數;
2、IComparer用於提供有別於IComparable的排序關系,或者為我們提供類型本身說沒有實現的排序關系。
二十七、避免ICloneable接口
1、對於值類型永遠不需要支持ICloneable接口使用默認的賦值操作即可;
2、對於可能需要支持ICloneable接口的基類,應該為其創造一個受保護的復制構造器,並應當避免支持IConeable接口。
二十八、避免強制轉換操作符
通過使用構造器來代替轉換操作符可以使轉換工作變得更清晰,由於在轉換後使用的臨時對象,容易導致一些詭異的BUG。
二十九、只有當新版積累導致問題是才考慮使用new修飾符
三十、盡可能實現CLS兼容的程序集
1、創建一個兼容的程序集需要遵循兩條規則:程序集中所有公有和受保護成員所使用的參數和返回值類型都必須與CLS兼容;任何與CLS不兼容的公有和受保護成員都必須有一個與CLS兼容的替代品;
2、可以通過顯式實現接口來避開CLS兼容類型檢查,及CLSCompliantAttribute不會檢查私有的成員的CLS兼容性。
三十一、盡可能實現短小簡潔的方法
1、JIT編譯器以方法為單位進行編譯,沒有被調用的方法不會被JIT編譯;
2、如果將較長的Switch中的Case語句的代碼替換成一個一個的方法,則JIT編譯器所節省的時間將成倍增加;
3、短小精悍的方法並選擇較少的局部變量可以獲得優化的寄存器使用;
4、方法內的控制分支越少,JIT編譯器越容易將變量放入寄存器。
三十二、盡可能實現小尺寸、高內聚的程序集
1、將所有的公有類以及共用的基類放到一些程序集中,把“為公有類提供功能的工具類”也放入同樣的程序集中,把相關的公有接口打包到他們自己的程序集中,最後處理遍布應用程序中“水平”位置的類;
2、原則上創建兩種組件:一種為小而聚合、具有某項特定功能的程序集,另一種為大而寬、包含共用功能的程序集。
三十三、限制類型的可見性
1、使用接口來暴露類型的功能,可以使我們更方便地創建內部類,同時又不會限制他們在程序集外的可用性;
2、向外暴露的公有類型越少,未來擴展和更改實現所擁有的選擇就越多。
三十四、創建大粒度的Web API
這是在機器之間的交易的頻率和載荷都降到最低,將大的操作和細粒度的執行放到服務器執行。
三十五、重寫優於事件處理器
1、一個事件處理器拋出異常,則事件鏈上的其他處理器將不會被調用,而重寫的虛方法則不會出現這種情況;
2、重寫要比關聯事件處理器高效得多,事件處理器需要迭代整個請求列表,這樣占用了更多的CPU時間;
3、事件能在運行時響應,具有更多的靈活性,可以對同一個事件關聯多個響應;
4、通行的規則是處理一個派生類的事件是,重寫方式較好。
三十六、合理使用.Net運行時診斷
1、System.Diagnostics.Debug\Trace\EventLog為運行時提供了程序添加診斷信息所需要的所有工具,EventLog提供入口時的應用程序能寫到系統事件日志中;
2、最後不要寫自己的診斷庫,.Net FCL 已經擁有了我們需要的核心庫。
三十七、使用標准配置機制
1、.Net框架的System.Windows.Application類為我們定義了建立通用配置路徑的屬性;
2、Application.LocalAppDataPath和Application.userDataPath 會生成本地數據目錄和用戶數據的路徑名;
3、不要在ProgramFiles和Windows系統目錄中寫入數據,這些位置需要更高的安全權限,不要指望用戶擁有寫入的權限。
三十八、定制和支持數據綁定
1、BindingMananger和CurrencyManager這兩個對象實現了控件和數據源之間的數據傳輸;
2、數據綁定的優勢:使用數據綁定要比編寫自己的代碼簡單得多;應該將它用於文本數據項之外的范圍-其他顯示屬性也可以被綁定;對於Windowos Forms 數據綁定能夠處理多個控件同步的檢查相關數據源;
3、在對象不支持所需的屬性時可以通過屏蔽當前的對象然後添加一個想要的對象來支持數據綁定。
三十九、使用.Net驗證
1、ASP.Net中有五種控件來驗證有效性,可以用CustomValidator派生一個新類來增加自己的認證器;
2、Windows驗證需要子System.Windows.Forms.Control.Validating些一個事件處理器。
四十、根據需要選用恰當的集合
1、數組有兩個比較明顯的缺陷:不能動態的調整大小;調整大小非常耗時;
2、ArrayList混合了一維數組和鏈表的特征,Queue和Stack是建立在Array基礎上的特殊數組;
3、當程序更加靈活的添加和刪除項時,可以使更加健壯的集合類型,當創建一個模擬集合的類時,應當為其實現索引器和IEnumberable接口。
四十一、DataSet優於自定義結構
1、DataSet有兩個缺點個:使用XML序列化機制的DataSet與非.Net 代碼之間的交互不是很好;DataSet是一個非常通用的容器;
2、強類型的DataSet打破了更多的設計規則,其獲得的開發效率要遠遠高於自己編寫的看上去更為優雅的設計。
四十二、利用特性簡化反射
通過設計和實現特性類,強制開發人員用他們來聲明可被動態使用的類型、方法和屬性,可以減少應用程序的運行時錯誤,提高軟件的用戶滿意度。
四十三、避免過度使用反射
1、Invoke成員使用的參數和返回值都是System.Object,在運行時進行類型的轉換,但出現問題的可能性也變得更多了;
2、接口使我們可以得到一個更為清晰、也更具可維護性的系統,反射式一個很強大的晚期綁定機制.Net框架使用它來實現Windows控件和Web控件的數據綁定。
四十四、為應用程序創建特定的異常類
1、需要不同的異常類的唯一原因是讓用戶在編寫catch處理器時能夠方便地對不同的錯誤采取不同的做法;
2、可能有不同的修復行為時我們才應該創建多種不同的異常類,通過提供異常基類所支持的所有構造器,可以為應用程序創建功能完整的異常類,使用InnerException屬性可以保存更低級別錯誤條件所產生的所有錯誤信息。
四十五、優先選擇異常安全保證
1、”強異常保證”在“從異常中恢復”和“簡化異常處理”之間提供了最好的平衡,在操作因為異常而中斷,程序的狀態保留不變;
2、對將要修改的數據做“防御性的復制”,對這些數據的“防御性復制”進行修改,這中間的操作可能會引發異常,將臨時的副本和原對象進行交換;
3、終結器、Dispose()方法和委托對象所綁定的目標方法在任何情況下都應當確保他們不會拋出異常。
四十六、最小化互操作
1、互操作有三個方面的代價:數據在托管堆和非托管堆之間的列舉成本,托管代碼和非托管代碼之間切換的成本,對開發人員來說與混合環境打交道的開發工作;
2、在interop中使用blittable類型可以有效地在托管和非托管環境中來回復制,而不受對象內部結構的影響;
3、使用In/Out特性來確保最貼切的不必要的多次復制,通過聲明數據如何被列舉來提高性能;
4、使用COM Interop用最簡單的方式實現和COM組件的互操作,使用P/Invoke調用Win32 API,或者使用C++編譯器的/CLR開關來混合托管和非托管的代碼;
四十七、優先選擇安全代碼
1、盡可能的避免訪問非托管內存,隔離存儲不能防止來自托管代碼和受信用戶的訪問;
2、程序集在Web上運行時可以考慮使用隔離存儲,當某些算法確實需要更高的安全許可時,應該將那些代碼隔離在一個單獨的程序集中。
四十八、掌握相關工具與資源
1、使用NUnit建立自動單元測試(集成在VS2010 中了);
2、FXCop工具會獲取程序集中的IL代碼,並將其與異族編碼規則和最佳實踐對照分析,最後報告違例情況;
3、ILDasm是一個IL反匯編工具,可以幫助我們洞察細節;
4、Shared Source CLI是一個包含.Net框架內核和C#編譯器的實現源碼。
四十九、為C#2.0做准備(這個規則現在已經沒什麼意義了,畢竟現在已經到了4.0 )
五十、了解ECMA標准
到這,關於C#編碼的注意事項,就給大家介紹完了。希望對你有幫助。
本文地址: http://www.caodong.Net/Article/1455.Html
【編輯推薦】