1:用屬性來訪問類的私有成員
Always use properties instead of accessible data members.
2:為常量優(yōu)先選擇readonly而不是const。
Prefer readonly to const.
const常量僅限于幾個基本類型,編譯時綁定;readonly常量在運行時綁定。
3:優(yōu)先選擇is或者as操作符而不是做強制類型轉(zhuǎn)換.
Prefer the is or as operators to casts.
4:使用Conditional屬性來代替IF/ENDIF程序塊。
Use Conditional Attributes Instead of #if。
5: 始終提供一個有意義的ToString函數(shù).
Always Provide ToString().
默認(rèn)繼承object的方法ToString()返回的結(jié)果是GetType()后轉(zhuǎn)換成String.
6:區(qū)別值類型數(shù)據(jù)和引用類型數(shù)據(jù).
Distinguish Between Value Types and Reference Types.
把底層面的數(shù)據(jù)用值類型來處理,而包含復(fù)雜操作,需要進(jìn)行擴展的數(shù)據(jù)用引用類型來處理。
7: 將值類型盡可能實現(xiàn)為具有常量性和原子性的類型.
Prefer Immutable Atomic Value Types.
兩種方法:1.所有成員加上readonly標(biāo)示,只在構(gòu)造函數(shù)中被修改;2.刪除屬性set部分。
在實現(xiàn)不可變的原子值類型(若其中包括引用類型分支)時,在進(jìn)行成員賦值時,防止淺copy。
8: 確保0為值類型的有效狀態(tài).
Ensure That 0 Is a Valid State for Value Types
數(shù)值類型的默認(rèn)值為0,但0在enum中可能無意義。
9: 理解4個相等判斷之間的關(guān)系.
Understand the Relationships Among ReferenceEquals(),static Equals(),instance Equals() and operator==.
ReferenceEquals():判斷兩個引用類型對象是否指向同一個地址;
static Equals() :把比較的職責(zé)委交給了一個正在比較的類型(第一個參數(shù)的類型);
instance Equals():類型重載函數(shù)。不要在值類型中重載此運算符(boxing開銷);
operator== :類型重載函數(shù)。不要在引用類型中重載此運算符;
10:理解GetHashCode()方法的缺陷.
Understand the Pitfalls of GetHashCode().
GetHashCode()的目的是產(chǎn)生一個Key,為了方便在HashTable或者Dictionary中的檢索。引用類型的GetHashCode()其實就是返回當(dāng)前引用標(biāo)記(一般都是正確的,不必override);值類型自帶的GetHashCode()是以其第一個成員的GetHashCode值作為其的返回值(一般都是不正確的)。
不建議使用值類型對象的GetHashCode函數(shù)返回值來作為HashTable對象的Key;
引用類型是可以使用的,但是要注意如果重寫了Equals函數(shù),一定要重寫GetHashCode函數(shù)來達(dá)到一致;
重寫此函數(shù)時注意:
1.不管是值類型還是引用類型,要保證產(chǎn)生HashCode的成員不能被修改;
2. 對于產(chǎn)生HashCode的成員修改,要以產(chǎn)生新對象進(jìn)行處理,同時要在使用端作相應(yīng)的修改,即先刪除舊的在添加新的。
11:優(yōu)先采用foreach循環(huán)語句.
Prefer foreach Loops.
foreach能為迭代非0下限的數(shù)組、多維數(shù)組生成正確的代碼。但foreach有兩個限制:1.不能修改枚舉成員;2.不要對集合進(jìn)行刪除操作。
浙公網(wǎng)安備 33010602011771號