1、使用屬性代替可訪問的資料成員
只要打算將資料暴露在類型的公有介面或受保護的介面中,我們都應該使用屬性來實現。對於具有序列或者字典特徵的類型,則應該採用索引器。所有資料成員都應一律聲明為私人。使用屬性的好處顯而易見:我們可以得到更好的資料繫結支援,我們可以更容易地在將來對其存取方法的實現做任何改變。將變數封裝在屬性中只不過增加幾行代碼。如果剛開始使用資料成員,後來又發現需要使用屬性,這時再來修改的成本將是幾個小時。今天投入一點,會為明天節省許多時間。
JIT編譯器會對某些方法調用(包括屬性訪問器)進行內聯處理,屬性和資料成員的效率沒有任何差別。及時屬性訪問器沒有被內聯,實際的效率差別相對於函數調用的成本來講也是可以忽略不計的。只有在很少的情況下,這種差別才值得我們注意。
2、運行時常量(readonly)優於編譯時間常量(const)
在c#中,我們用readonly關鍵字聲明運行時常量,用const關鍵字來聲明編譯時間常量。
編譯時間常量在編譯後的結果代碼中會被替換為該常量的值。運行時常量在運行時被計算,編譯後代碼將維持對readonly變數(而非它的值)的引用。
編譯時間常量只可用於實值型別,運行時常量則沒有限制。
使用const較之於使用readonly的唯一好處就是效能:使用已知常量值得代碼效率要比訪問readonly值的代碼效率稍好一點,但是其中的效率提升是非常小的。
只有當某些情況要求變數的值必須在編譯時間可用,才應該考慮使用const,例如:特性(attribute)類的參數,枚舉定義,以及某些不隨組件版本變化而變化的值。否則,對於其他任何情況,都應該優先選擇readonly常量,從而獲得其所具有的靈活性。
3、操作符is或as優於強制轉型
好的物件導向實踐對告誡我們避免轉型,但有時候我們別無選擇。不能避免轉型時,我們應該盡量使用as和is操作符來清晰的表達意圖。
當我們要立即進行轉型時,我們應使用as操作符。如果僅僅是進行類型的判斷而不需要立即進行轉型,使用is即可。
4、使用Conditional特性代替#if條件編譯
使用Conditional特性比使用#if/#endif產生的IL代碼更有效。同時,將其限制在函數層次上可以清晰的講條件行代碼分離出來,從而使我們的代碼具有更好的機構。另外,C#編譯器也為此提供了很好的支援,從而協助我們避免以前使用#if或#endif時犯的錯誤。
5、總是提供ToString()方法
System.Object預設提供的ToString()方法會傳回型別的名稱。我們可以簡單的重寫ToString()方法,來滿足我們的要求。也可以提供重載的ToString()方法,使用格式字串來為我們的類型指定自己的格式,滿足更複雜的需求。
6、優先採用foreach迴圈語句
foreach是一個非常有用的語句,它會使用最高效的構造為“數組的上下界索引”、“多維陣列遍曆”和“運算元轉型”產生正確的代碼,並且產生的是最具效率的迴圈結構。它是遍曆集合的最佳方式。
任何集合類型都可以使用foreach。有3種方法可以使一個類支援foreach方法:
(1)類型具備一個公有的GetEnumerator()方法;
(2)類型顯示實現了IEnumerable介面;
(3)類型實現了IEnumerator介面。