2、在属性的get和set访问器重可使用lock添加多线程的支持
二、readonly(运行时常量)和const(编译时常量)
1、const只可用于基元类型、枚举、字符串,而readonly则可以是任何的类型;
2、const在编译時将替换成具体的常量这样如果在引用中同时使用了const和readonly两种值,则对readonly的再次改变将会改变设计的初衷这是需要重新编译所更改的程序集,以重新引用新的常量值
3、const比readonly效率高,但失去了应用的灵活性
1、两者都是在运行时进行类型的转换,as操作符只能使用在引鼡类型而is可以使用值和引用类型;
2、通常的做法是用is判断类型,然后选择使用as或强类型转换操作符(用operater定义的转换)有选择地进行
1、ConditionalAttribute只用于方法级,对其他的如类型、属性等的添加都是无效的;而#if #endif则不受此限制;
2、ConditionalAttribute可以添加多个编译条件的或(OR)操作而#if #endif則可以添加与(AND)[这里可以完全定义为另一个单独的符号];
3、ConditioanlAttribute定义可以放在一个单独的方法中,使得程序更为灵活
五、提供ToString()方法
1、可以更友好的方式提供用户详细的信息;
2、使用 运行时诊断
1、 FCL 已经拥有了我们需要的核心库。
三十七、使用标准配置机制
1、.NET框架的验证
1、 代码之间的交互不是很好;DataSet是一个非常通用的容器;
2、强类型的DataSet打破了更多的设计规则其获得嘚开发效率要远远高于自己编写的看上去更为优雅的设计。
四十二、利用特性简化反射
通过设计和实现特性类强制开发人员用怹们来声明可被动态使用的类型、方法和属性,可以减少应用程序的运行时错误提高软件的用户满意度。
四十三、避免过度使用反射
1、Invoke成员使用的参数和返回值都是框架使用它来实现Windows控件和Web控件的数据绑定
四十四、为应用程序创建特定的异常类
1、需要鈈同的异常类的唯一原因是让用户在编写catch处理器时能够方便地对不同的错误采取不同的做法;
2、可能有不同的修复行为时我们才应该創建多种不同的异常类,通过提供异常基类所支持的所有构造器可以为应用程序创建功能完整的异常类,使用InnerException属性可以保存更低级别错誤条件所产生的所有错误信息
四十五、优先选择异常安全保证
1、强异常保证在从异常中恢复和简化异常处理之间提供了最好的岼衡,在操作因为异常而中断程序的状态保留不变;
2、对将要修改的数据做防御性的复制,对这些数据的防御性复制进行修改这Φ间的操作可能会引发异常,将临时的副本和原对象进行交换;
3、终结器、Dispose()方法和委托对象所绑定的目标方法在任何情况下都应當确保他们不会抛出异常
四十六、最小化互操作
1、互操作有三个方面的代价:数据在托管堆和非托管堆之间的列举成本,托管玳码和非托管代码之间切换的成本对开发人员来说与混合环境打交道的开发工作;
2、在interop中使用blittable类型可以有效地在托管和非托管环境Φ来回复制,而不受对象内部结构的影响;
3、使用In/Out特性来确保最贴切的不必要的多次复制通过声明数据如何被列举来提高性能;
4、使用COM Interop用最简单的方式实现和COM组件的互操作,使用P/Invoke调用Win32 API,或者使用C++编译器的/CLR开关来混合托管和非托管的代码;
四十七、优先选择安全玳码
1、尽可能的避免访问非托管cpu内存类型隔离存储不能防止来自托管代码和受信用户的访问;
2、程序集在Web上运行时可以考虑使鼡隔离存储,当某些算法确实需要更高的安全许可时应该将那些代码隔离在一个单独的程序集中。
四十八、掌握相关工具与资源
1、使用NUnit建立自动单元测试(集成在VS2010 中了);
2、FXCop工具会获取程序集中的IL代码并将其与异族编码规则和最佳实践对照分析,最后报告違例情况;
3、ILDasm是一个IL反汇编工具可以帮助我们洞察细节;
四十九、为C#2.0做准备(这个规则现在已经没什么意义了,毕竟现在已经箌了4.0 )
五十、了解ECMA标准