Effective C#原則8:確保0對於值類型數據是有效的(2)
最後創建的ObservationData的成員_magnitude的值是0,這 是合理的。但_whichPlanet卻是無效的。你須要讓0也是有效的(狀態)。
Effective C#原則7: 選擇恆定的原子值類型數據(1)
恆定類型(immutable types)其實很簡單,就是一但它們被創建,它們(的值) 就是固定的。如果你驗證一些准備用於創建一個對象的參數,你知道它在驗證狀
Effective C#原則7: 選擇恆定的原子值類型數據(2)
內部狀 態的改變意味著它很可能違反了對象的不變性,至少是臨時的。當你改變了City 這個字段後,你就使a1處於無效狀態。城市的改變使得它與洲字段及以區碼字段
Effective C#原則7: 選擇恆定的原子值類型數據(3)
現在,你就擁有了 一個恆定類型。為了讓它有效的工作,你必須添加一個構造函數來完全初始化 address結構。這個address結構只須要額外的添加一個構造函數
Effective C#原則7: 選擇恆定的原子值類型數據(4)
a1的值是兩者之一:它的原始位置 Anytown,或者是後來更新後的位置Ann Arbor。你再不用像前面的例子那樣,為 了修改已經存在的地址而使對象產生臨時
Effective C#原則7: 選擇恆定的原子值類型數據(5)
這個數組是一個引用類型。PhoneList內部引用的數組,引用 了分配在對象外的數組存儲空間上。開發人員可以通過另一個引用到這個存儲空 間上的對象來修改你的恆
Effective C#原則6:區別值類型數據和引用類型數據(2)
現在,v是原始數據_myData的一個COPY 。做為一個引用類型,兩個對象都是在內存堆上創建的。你不會因為暴露內部數 據而遇到麻煩。取而代之的是你會在堆上建
Effective C#原則5:始終提供ToString()(2)
如果你不遵守這一原則裡的其它意見,就 按照上面的方法為你所定義的所有類型重寫該方法。它會直接為每個人省下時間 。當你負責任的為Object.ToString(
Effective C#原則5:始終提供ToString()(3)
譯注:上面的做法顯然不合理,要是我的 對象有10個成員,這樣的組合是會讓人瘋掉的。推薦使用正則表達式來完成這樣 的工作,正則表達式在處理文字時的表現還是很出色
Effective C#原則4:用條件屬性而不是#if預編譯塊(1)
使用#if/#endif 塊可以在同樣源碼上生成不同的編譯(結果),大多數debug 和release兩個版本。但它們決不是我們喜歡用的工具。由於#if/#e
Effective C#原則4:用條件屬性而不是#if預編譯塊(2)
這一切在 Debug模式下工作的很正常,但在release下卻輸出的為空行。release模式很樂 意給你輸出一個空行,然而這並不是你所期望的。傻眼了吧,但編
Effective C#原則3:選擇is或者as操作符而不是做強制類型轉換(1)
C#是一個強數據類型語言。好的編程實踐意味著當可以避免從一種數據類型 強制轉化為另種數據類型時,我們應該盡我們的所能來避免它。但在某些時候, 運行時類型檢測是
Effective C#原則3:選擇is或者as操作符而不是做強制類型轉換(2)
你會同意第一種寫法更簡單更容易讀。它沒有try/catch結構, 所以你可以同時避免(性能)開銷和(多寫)代碼。我們注意到,強制轉換的方法為 了檢測轉換是否把
Effective C#原則3:選擇is或者as操作符而不是做強制類型轉換(4)
但下面的轉換只 會有一種行為,而不管st是什麼類型。所以你應該選擇as來轉換對象, 而不是強制類型轉換。實際上,如果這些類型與繼承沒有關系,但是用戶自己定 義
Effective C#原則2:為你的常量選擇readonly而不是const(1)
對於常量,C#裡有兩個不同的版本:運行時常量和編譯時常量。因為 他們有不同的表現行為,所以當你使用不當時,將會損傷程序性能或者出現錯誤 。兩害相權取其輕,當我
Effective C#原則2:為你的常量選擇readonly而不是const(3)
從MSIL 命令清單的最上面一行你可以看到,StartValue(的值)是動態載入的。但是,在MSIL命令的最後,結束條件是把值10當成硬代碼(hard-co
Effective C#原則1:盡可能的使用屬性(property),而不是數據成員(field)(1)
我們的目標:盡可能編寫出運行效率更高,更健壯,更容易維護的C#代碼。原則一:盡可能的使用屬性(property),而不是數據成員(fIEld)。Always
Effective C#原則1:盡可能的使用屬性(property),而不是數據成員(field)(2)
3、線程同步對 實例的屬性可以進行線程同步,而與訪問者無關。例如:public string Name{ set{ lock(this){