35.重寫函數優于事件處理器。
Prefer Overrides to Event Handlers。
e.g.:實現Form實例時,選擇重寫OnMouseDown()方法而不是添加事件句柄OnMouseDown()。使用事件有更大的伸縮性,可以在一個事件上添加多個句柄;當有一個派生類中只有一個函數來處理一個事件時,最好用重載太提高可維護性。
36.合理使用.NET運行時診斷。
Leverage .NET Runtime Diagnostics。
System.Diagnostics.Debug, System.Diagnostics.Trace和System.Diagnostics.EventLog類可以在程序運行時創建診斷信息。Trace類是由預處理符TRACE進行控制;Debug類是由DEBUG預處理符進行控制;EventLog類可以寫一些系統日志,EventLog類不支持運行時配置,但可以把它封裝到一個統一的簡單接口中。
37.使用標準配置機制。
Use the Standard Configuration Mechanism。
在WinForm應用程序中,每個應用程序域最多只有一個應用程序程序配置文件,默認的配置文件應該與應用程序位于同一個目錄中,而且以<應用程序名>.<擴展名>.config來命名。Web應用程序相對而言就比較靈活,每個目錄都可以有一個自己的配置文件,以web.config來命名。
38.定制和支持數據綁定。
Utilize and Support Data Binding。
使用數據綁定比自己寫代碼要簡單得多;在對文字元素通過屬性來顯示時,盡可能的使用數據綁定而不是顯式賦值;在WinForm中,可以對同步的對綁定在多控件上的數據進行相關數據源的檢測。.Net框架支持把一個對象的屬性映射到控件的屬性上(e.g:textBoxName.DataBindings.Add("Text",myDataValue, "Name");可以把textBoxName控件的“Text”屬性上綁定了MyDataValue對象的"Name"屬性。)。
39.使用.NET驗證。
Use .NET Validation。
Web應用程序應該在瀏覽器上進行數據驗證,一般是使用JavaScript,一些Web驗證控件在生成HTML頁面中生成一些JS代碼,當每一項輸入時,不用每次返回數據到服務器上。但這還不夠,我們還是要在服務器端做一些額外的驗證,以免受到程序式的攻擊。WinForm中用戶的輸入可以直接用C#代碼來驗證,所有的Windows控件都是可驗證的,一般使用屬性訪問時的異常來指示非法的輸入。
40.根據需要選用恰當的集合。
Match Your Collection to Your Needs。
訪問多維數組比訪問鋸齒數組的效率高,訪問多維數組時編譯器在數組的每個維上是使用的是指針算法,而鋸齒數組則要為每個一維數組查找正確的(指針引用)值。
ArrayList的效率和數組差不多,其優點是可以在運行時動態調整容量大小;隊列(Queue)和棧(Stack)是在System.Array類上提供了特殊的接口,它們的內部存儲都是基于數組的,修改容量大小時同樣會帶來性能損失;隊列的默認大小是32(0x20,乘2增長),而棧的默認大小是10(乘2增長),ArrayList默認是0(0-4-8-16……乘2增長);
ListDictionary類用鍵/值對方式實現了單向鏈表;
SortedList 和Hashtable都包含鍵/值對,SortedList以鍵進行排序,提供了基于鍵的有序迭代;而Hashtable在給定的鍵上進行查找時更快,可以通過鍵的散列值進行查找(O(1)算法);HashTable的默認大小為11,SortedList的默認大小為0(0-16-32……乘2增長);
BitArray存儲位數組,它是以整數的數組來存儲數據的;不要用它來替換一般的圖和Boolean數組;
CollectionBase和ReadOnlyCollectionBase提供了列表和向量結構的基類,DictionaryBase提供了鍵/值對應的基類,DictionaryBase類是建立在Hashtable上的,它的性能與Hashtable是一致的;
定長buffer使得我們可以在unsafe結構里聲明C風格的數組(e.g:unsafe struct MyClass{public fixed int x[5];}),其主要應用在托管代碼和非托管代碼互操作的情況,除此之外,我們一般使用托管數組。
41.優先選擇DataSet,而不是使用自定義結構。
Prefer DataSets to Custom Structures。
如果我們要創建的集合是一個基于某些算法的、對性能要求嚴格的集合,或者必須有輕便的格式,則我們就要使用自定義結構,否則最好使用DataSet,尤其是類型化的DataSet。
42.利用特性簡化反射。
Utilize Attributes to Simplify Reflection.
特性可以申明運行的意圖,通過使用特性來標記一個元素,可以在運行時指示它的用處以及簡化查找這個元素的工作(通過反射來判斷類或成員上是否應有了某些特性,進而在實際運行中進行配置);通過使用特性來標記意圖,就把大量的責任從開發者身上移到了編譯器身上。
43.避免過度使用反射。
Don't Overuse Reflection.
使用反射,一個應用程序可以通過添加新的組件來更新功能,實現可動態配置的軟件;但同時也帶來安全性的問題(成員調用的參數和返回值是以System.Object類型存在的,我們必須在運行時確保這些類型是正確的)。反射應該只在某些調用目標不能清楚的用接口表示時才使用(e.g:.Net的數據綁定)。很多常規情況下很少用反射,而是使用類廠、委托以及接口來創建代碼,這可以產生出更容易維護的系統。
44.為應用程序創建特定的異常類。
Create Complete Application-Specific Exception Classes.
讓你的用戶在寫catch語句來處理錯誤時更簡單,我們通常要自己創建不同的異常類。當且僅當對于錯誤有不同的行為要處理時,我們才應該創建不同的異常類(從ApplicationException繼承而不是從Exception繼承);可以通過提供所有基類支持的構造函數,來創建全功能的異常類;還可以使用InnerException屬性來承載底層錯誤條件的所有錯誤信息。
文章來源:http://blog.csdn.net/happyhippy/archive/2007/04/09/1557696.aspx
浙公網安備 33010602011771號