# 第三章 用 C# 表達設計
**By D.S.Qiu**
**尊重他人的勞動,支持原創,轉載請注明出處:[http://dsqiu.iteye.com](http://dsqiu.iteye.com)**
初學者用外語溝通。他們掌握單詞,就可以組合起來表達他們的觀點。隨著初學者向專家轉變,它們開始使用合適的成語和習語。語言變得更不像是外語,與人說話的時候就更高效、更清楚的。編程語言也沒有什么不同的。你選擇的技術和維護者,擴展者,或者是使用你的軟件的開發者交流設計。C# 的類型總是存在 .NET 環境中。這個環境對所有類型做了一些假設。你違反了這些假設,你就增加你的函數不正確的可能性。
這章的原則不是軟件設計——這卷都有關軟件設計的剛要。而是,這些原則突出不同 C# 語言的特征如何更好的表達你設計的意圖。C# 語言設計者增加語言特征使得表達現代設計習慣更加清晰。這些特征和其他語言的區別是很微妙的,而且你經常有很多選擇。首先有多個選擇就最好不過了,當你發現了后面介紹的區別你就應該改進你的程序。確保理解這些原則,并應用于那些可以以改進的系統。
一些語法引入了新的詞匯描述你每天使用的習語。屬性,索引器,事件和委托就是例子,并且類和接口是不同的:類定義類型,接口聲明行為。基類聲明類型并定義相關類型的公有行為。其他一些設計習慣隨著垃圾回收器而改變。并且其他的習慣也隨著引用類型變量而改變。
這章的建議會幫助你為你的設計選擇最自然的表達。這會使得你創建的軟件易于維護,易于擴展,并且易于使用。
小結:
第三章結合實際問題對軟件設計給了很多建議,總之,更懂 C# ,你的軟件就會更易于維護,更易于擴展,更易于使用,一句哈:no zuo no die !
附上第三章目錄:
+ [原則22:選擇定義并實現接口,而不是基類](/blog/2083404)
+ [原則23:理解接口方法和虛函數的區別](/blog/2083428)
+ [原則24:使用委托來表達回調](/blog/2083564)
+ [原則25:實現通知的事件模式](/blog/2085830)
+ [原則26:避免返回類的內部對象的引用](/blog/2086266)
+ [原則27:總是使你的類型可序列化](/blog/2086349)
+ [原則28:創建大粒度的網絡服務 APIs](/blog/2086414)
+ [原則29:讓接口支持協變和逆變](/blog/2086977)
歡迎各種不爽,各種噴,寫這個純屬個人愛好,秉持”分享“之德!
有關本書的其他章節翻譯請[點擊查看](/category/297763),轉載請注明出處,尊重原創!
如果您對D.S.Qiu有任何建議或意見可以在文章后面評論,或者發郵件(gd.s.qiu@gmail.com)交流,您的鼓勵和支持是我前進的動力,希望能有更多更好的分享。
轉載請在**文首**注明出處:[http://dsqiu.iteye.com/blog/2086981](/blog/2086981)
更多精彩請關注D.S.Qiu的博客和微博(ID:靜水逐風)
- 第一章 C# 語言習慣
- 原則1:使用 屬性(Poperty)代替可直接訪問的數據成員(Data Member)
- 原則2:偏愛 readonly 而不是 const
- 原則3:選擇 is 或 as 而不是強制類型轉換
- 原則4:使用條件特性(conditional attribute)代替 #if
- 原則5:總是提供 ToString()
- 原則6:理解幾個不同相等概念的關系
- 原則7:明白 GetHashCode() 的陷阱
- 原則8:優先考慮查詢語法(query syntax)而不是循環結構
- 原則9:在你的 API 中避免轉換操作
- 原則10:使用默認參數減少函數的重載
- 原則11:理解小函數的魅力
- 第二章 .NET 資源管理
- 原則12:選擇變量初始化語法(initializer)而不是賦值語句
- 原則13:使用恰當的方式對靜態成員進行初始化
- 原則14:減少重復的初始化邏輯
- 原則15:使用 using 和 try/finally 清理資源
- 原則16:避免創建不需要的對象
- 原則17:實現標準的 Dispose 模式
- 原則17:實現標準的 Dispose 模式
- 原則18:值類型和引用類型的區別
- 原則19:確保0是值類型的一個有效狀態
- 原則20:更傾向于使用不可變原子值類型
- 第三章 用 C# 表達設計
- 原則21:限制你的類型的可見性
- 原則22:選擇定義并實現接口,而不是基類
- 原則23:理解接口方法和虛函數的區別
- 原則24:使用委托來表達回調
- 原則25:實現通知的事件模式
- 原則26:避免返回類的內部對象的引用
- 原則27:總是使你的類型可序列化
- 原則28:創建大粒度的網絡服務 APIs
- 原則29:讓接口支持協變和逆變
- 第四章 和框架一起工作
- 原則30:選擇重載而不是事件處理器
- 原則31:用 IComparable<T> 和 IComparer<T> 實現排序關系
- 原則32:避免 ICloneable
- 原則33:只有基類更新處理才使用 new 修飾符
- 原則34:避免定義在基類的方法的重寫
- 原則35:理解 PLINQ 并行算法的實現
- 原則36:理解 I/O 受限制(Bound)操作 PLINQ 的使用
- 原則37:構造并行算法的異常考量
- 第五章 雜項討論
- 原則38:理解動態(Dynamic)的利與弊
- 原則39:使用動態對泛型類型參數的運行時類型的利用
- 原則40:使用動態接收匿名類型參數