# 第三章 用 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:使用动态接收匿名类型参数