# 第一章 C# 语言习惯
**By D.S.Qiu**
尊重他人的劳动,**支持原创,转载请注明[出处](/blog/1986914):[http://dsqiu.iteye.com](http://dsqiu.iteye.com)**
为什么程序已经能正常工作了,你还要改变它呢?答案就是你相信可以让它变得更好。你改变工具或语言,因为你可以变得更富有成效。如果你不改变你的习惯,你将不会受到预期的效果。对于C#这种和我们已经熟悉的语言,如 C++ 或 Java 有诸多共通之处的新语言,情况更是如此。 C# 是另一个强大的语言,很容易陷入其他语言的语言习惯。这将阻止你掌握最有效的 C# 。 C# 语言从2001年发布的第一个商业化版本以来一直在演变。相比早期的版本,它变得更加远离 C++ 或 Java 。如果你是从另一种语言转到 C# 语言的,你需要学习 C# 的习惯用法以至于语言为你所有,而不是阻碍你。本章讨论你应该改变的习惯并且你需要做什么。
小结:
附上第一章的目录:
+ [原则1:使用 属性(Poperty)代替可直接访问的数据成员(Data Member)](/blog/1976256)
+ [原则2:偏爱 readonly 而不是 const](/blog/1976703)
+ [原则3:选择 is 或 as 而不是强制类型转换](/blog/1977594)
+ [原则4:使用条件特性(conditional attribute)代替 #if](/blog/1979093)
+ [原则5:总是提供 ToString()](/blog/1979985)
+ [原则6:理解几个不同相等概念的关系](/blog/1980083)
+ [原则7:明白 GetHashCode() 的陷阱](/blog/1981202)
+ [原则8:优先考虑查询语法(query syntax)而不是循环结构](/blog/1982137)
+ [原则9:在你的 API 中避免转换操作](/blog/1983118)
+ [原则10:使用默认参数减少函数的重载](/blog/1986873)
+ [原则11:理解小函数的魅力](/blog/1986910)
从字面上看,感觉第一章主要介绍的是 C# 的语法,但是D.S.Qiu 重点应该是本书或者是 C# 强调的规范或编程模式。
D.S.Qiu
Effective C# 中文版改善C#程序的50种方法 第二版
Effective C# : 50 Specific Ways to Improve Your C# 2nd Edition
- 第一章 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:使用动态接收匿名类型参数