Effective C# 摘錄(5) – 使用架構

來源:互聯網
上載者:User


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];}),其主要應用在Managed 程式碼和Unmanaged 程式碼互操作的情況,除此之外,我們一般使用託管數組。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.