1:用屬性來訪問類的私人成員
Always use properties instead of accessible data members.
2:為常量優先選擇readonly而不是const。
Prefer readonly to const.
const常量僅限於幾個基本類型,編譯時間綁定;readonly常量在運行時綁定。
3:優先選擇is或者as操作符而不是做強制類型轉換.
Prefer the is or as operators to casts.
4:使用Conditional屬性來代替IF/ENDIF程式塊。
Use Conditional Attributes Instead of #if。
5: 始終提供一個有意義的ToString函數.
Always Provide ToString().
預設繼承object的方法ToString()返回的結果是GetType()後轉換成String.
6:區別實值型別資料和參考型別資料.
Distinguish Between Value Types and Reference Types.
把底層面的資料用實值型別來處理,而包含複雜操作,需要進行擴充的資料用參考型別來處理。
7: 將實值型別儘可能實現為具有常量性和原子性的類型.
Prefer Immutable Atomic Value Types.
兩種方法:1.所有成員加上readonly標示,只在建構函式中被修改;2.刪除屬性set部分。
在實現不可變的原子實值型別(若其中包括參考型別分支)時,在進行成員賦值時,防止淺copy。
8: 確保0為實值型別的有效狀態.
Ensure That 0 Is a Valid State for Value Types
數實值型別的預設值為0,但0在enum中可能無意義。
9: 理解4個相等判斷之間的關係.
Understand the Relationships Among ReferenceEquals(),static Equals(),instance Equals() and operator==.
ReferenceEquals():判斷兩個參考型別對象是否指向同一個地址;
static Equals() :把比較的職責委交給了一個正在比較的類型(第一個參數的類型);
instance Equals():類型重載函數。不要在實值型別中重載此運算子(boxing開銷);
operator== :類型重載函數。不要在參考型別中重載此運算子;
10:理解GetHashCode()方法的缺陷.
Understand the Pitfalls of GetHashCode().
GetHashCode()的目的是產生一個Key,為了方便在HashTable或者Dictionary中的檢索。參考型別的GetHashCode()其實就是返回當前引用標記(一般都是正確的,不必override);實值型別內建的GetHashCode()是以其第一個成員的GetHashCode值作為其的傳回值(一般都是不正確的)。
不建議使用實值型別對象的GetHashCode函數傳回值來作為HashTable對象的Key;
參考型別是可以使用的,但是要注意如果重寫了Equals函數,一定要重寫GetHashCode函數來達到一致;
重寫此函數時注意:
1.不管是實值型別還是參考型別,要保證產生HashCode的成員不能被修改;
2. 對於產生HashCode的成員修改,要以產生新對象進行處理,同時要在使用端作相應的修改,即先刪除舊的在添加新的。
11:優先採用foreach迴圈語句.
Prefer foreach Loops.
foreach能為迭代非0下限的數組、多維陣列產生正確的代碼。但foreach有兩個限制:1.不能修改枚舉成員;2.不要對集合進行刪除操作。