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.不要對集合進行刪除操作。