Effective c#
第一章 c#语言元素
条款一使用属性代替可访问的数据成员
public int this[int index]
{
get{ return _theValues[index];}
set{ _theValues[index] = value;}
}
索引器---含参属性
条款二运行时常量readonly优于编译时常量 const
条款三操作符is或 as优于强制类型
条款四使用conditional特性代替 #if条件编译
[Conditional("DEBUG")]
private void CheckState()
{
}
条款五总是提供tostring()方法
public override string ToString(){
}
条款六明辩值类型和引用类型的使用场合
条款七将值类型尽可能实现为具有常量性和原子性的类型
条款八确保0为值类型的有效状态
[Flags]
public enum Styles
{
None = 0,
.....
}
条款九理解几个相等判断之间的关系
对于值类型 都要重写Equals()
同时重写Equals() 和 GetHashCode()
条款十理解GetHashCode()方法的缺陷
条款十一优先采用foreach循环语句
集合类:
1.类型具备一个公有的GetEnumerator();
2.类型显示实现了IEnumerable接口
3.类型实现了IEnumerator接口
第二章 .net资源管理
条款十二变量初始化器优于赋值语句
条款十三使用静态构造器初始化静态类成员
条款十四利用构造器链
条款十五利用using和 try/finally语句来清理资源
条款十六尽量减少内存垃圾
条款十七尽量减少装箱和拆箱
条款十八实现标准Dispose模式
第三章使用c#表达设计
条款十九定义并实现接口优于继承类型
条款二十明辩接口实现和虚方法重写
条款二十一使用委托表达回调
条款二十二使用事件定义外发接口
条款二十三避免返回内部类对象的引用
条款二十四声明式编程优于命令式编程
条款二十五尽可能将类型实现为可序列化的类型
条款二十六使用IComparable和 IComparer接口实现排序关系
条款二十七避免ICloneable接口
条款二十八避免强制转换操作符
条款二十九只有当新版基类导致问题时才考虑使用new修饰符
第四章创建二进制组件
条款三十尽可能实现cls兼容的程序集
条款三十一尽可能实现短小简洁的函数
条款三十二尽可能实现小尺寸,高内聚的程序集
条款三十三限制类型的可见性
条款三十四创建大粒度的 web api
第五章使用框架
条款三十五重写优于事件处理器
条款三十六合理使用.net运行时诊断
条款三十七使用标准配置机制
条款三十八定制和支持数据绑定
条款三十九使用.net验证
条款四十根据需要选用恰当的集合
条款四十一 dataset优于自定义结构
条款四十二利用特性简化反射
条款四十三 避免过度使用反射
条款四十四为应用程序创建特定的异常类
第六章杂项讨论
条款四十五优先选择强异常安全保证
条款四十六最小化互操作
条款四十七优先选择安全代码
条款四十八掌握相关工具与资源
条款四十九为C#2。0做准备
条款五十了解ECMA标准
More Effective c#
第一章 使用泛型
条目1 使用1.x框架API的泛型版本
条目2 恰到好处的定义约束
条目3 运行时检查参数的类型并提供特定的算法
条目4 使用泛型强制编译期类型推断
条目5 确保泛型类型支持可销毁对象
条目6 使用委托定义类型参数上的方法约束
条目7 不要为基类或接口创建泛型的特殊实现
条目8 尽可能使用泛型方法,除非需要将类型参数用于实例的字段中
条目9 使用泛型元祖代替out和ref参数
条目10 在实现泛型接口的同时也实现传统接口
第二章 C#中的多线程
条目11 :使用线程池而不是创建线程
条目12 :使用BackgroundWorker实现线程间通信
条目13 :让lock()作为同步的第一选择
条目14 :尽可能地减小锁对象的作用范围
条目15 :避免在锁定区域内调用外部代码
条目16 :理解 windows窗体和 wpf中的跨线程调用
第三章 c#设计实践
条目17 :为序列创建可组合的API
条目18 :将遍历和操作,谓词以及函数分开
条目19 :根据需要生成序列中的元素
条目20 :使用函数参数降低耦合
条目21 :让重载方法组尽可能清晰最小化且完整
条目22 :定义方法后再重载操作符
条目23 :理解事件是如何增加对象间运行时耦合的
条目24 :仅声明非虚的事件
条目25 :使用异常来报告方法的调用失败
条目26 :确保属性的行为与数据类似
条目27 :区分继承和组合
第四章 c#3.0语言增强
条目28 使用扩展方法增强现有接口
条目29 使用扩展方法增强现有类型
条目30 推荐使用隐式类型局部变量
条目31 使用匿名类型限制类型的作用域
条目32 为外部组件创建可组合的API
条目33 避免修改绑定变量
条目34 为匿名类型定义局部函数
条目35 不要在不同命名空间中声明同名的扩展方法
第五章 使用Linq
条目36 理解查询表达式与方法调用之间的映射
条目37 推荐使用延迟求值查询
条目38 推荐使用Lambda表达式而不是方法
条目39 避免在函数或操作中抛出异常
条目40 区分早期执行和延迟执行
条目41 避免在闭包中捕获昂贵的外部资源
条目42 区分IEnumerable 和 IQueryable
条目43 使用Single()和First()来明确给出对查询结果的期待
条目44 推荐保存Expression<>而不是Func<>
第六章 杂项
条目45 最小化可空类型的可见范围
条目46 为部分类的构造函数,修改方法以及事件处理程序提供部分方法
条目47 仅在需要parms数组时才使用数组作为参数
条目48 避免在构造函数中调用虚方法
条目49 考虑为大型对象使用弱引用
条目50 使用隐式属性表示可变但不可序列化的数据