Effective C# 摘录(5) - 使用框架


35.重写函数优于事件处理器。

   Prefer Overrides to Event Handlers。
   e.g.:实现Form实例时,选择重写OnMouseDown()方法而不是添加事件句柄OnMouseDown()。使用事件有更大的伸缩性,可以在一个事件上添加多个句柄;当有一个派生类中只有一个函数来处理一个事件时,最好用重载太提高可维护性。


36.合理使用.NET运行时诊断。
   Leverage .NET Runtime Diagnostics。
   System.Diagnostics.Debug, System.Diagnostics.Trace和System.Diagnostics.EventLog类可以在程序运行时创建诊断信息。Trace类是由预处理符TRACE进行控制;Debug类是由DEBUG预处理符进行控制;EventLog类可以写一些系统日志,EventLog类不支持运行时配置,但可以把它封装到一个统一的简单接口中。

37.使用标准配置机制。
   Use the Standard Configuration Mechanism。
   在WinForm应用程序中,每个应用程序域最多只有一个应用程序程序配置文件,默认的配置文件应该与应用程序位于同一个目录中,而且以<应用程序名>.<扩展名>.config来命名。Web应用程序相对而言就比较灵活,每个目录都可以有一个自己的配置文件,以web.config来命名。

38.定制和支持数据绑定。
   Utilize and Support Data Binding。
   使用数据绑定比自己写代码要简单得多;在对文字元素通过属性来显示时,尽可能的使用数据绑定而不是显式赋值;在WinForm中,可以对同步的对绑定在多控件上的数据进行相关数据源的检测。.Net框架支持把一个对象的属性映射到控件的属性上(e.g:textBoxName.DataBindings.Add("Text",myDataValue, "Name");可以把textBoxName控件的“Text”属性上绑定了MyDataValue对象的"Name"属性。)。

39.使用.NET验证。
   Use .NET Validation。
   Web应用程序应该在浏览器上进行数据验证,一般是使用JavaScript,一些Web验证控件在生成HTML页面中生成一些JS代码,当每一项输入时,不用每次返回数据到服务器上。但这还不够,我们还是要在服务器端做一些额外的验证,以免受到程序式的攻击。WinForm中用户的输入可以直接用C#代码来验证,所有的Windows控件都是可验证的,一般使用属性访问时的异常来指示非法的输入。

40.根据需要选用恰当的集合。
   Match Your Collection to Your Needs。
   访问多维数组比访问锯齿数组的效率高,访问多维数组时编译器在数组的每个维上是使用的是指针算法,而锯齿数组则要为每个一维数组查找正确的(指针引用)值。
   ArrayList的效率和数组差不多,其优点是可以在运行时动态调整容量大小;队列(Queue)和栈(Stack)是在System.Array类上提供了特殊的接口,它们的内部存储都是基于数组的,修改容量大小时同样会带来性能损失;队列的默认大小是32(0x20,乘2增长),而栈的默认大小是10(乘2增长),ArrayList默认是0(0-4-8-16……乘2增长);
   ListDictionary类用键/值对方式实现了单向链表;
   SortedList 和Hashtable都包含键/值对,SortedList以键进行排序,提供了基于键的有序迭代;而Hashtable在给定的键上进行查找时更快,可以通过键的散列值进行查找(O(1)算法);HashTable的默认大小为11,SortedList的默认大小为0(0-16-32……乘2增长);
   BitArray存储位数组,它是以整数的数组来存储数据的;不要用它来替换一般的图和Boolean数组;
   CollectionBase和ReadOnlyCollectionBase提供了列表和向量结构的基类,DictionaryBase提供了键/值对应的基类,DictionaryBase类是建立在Hashtable上的,它的性能与Hashtable是一致的;
   定长buffer使得我们可以在unsafe结构里声明C风格的数组(e.g:unsafe struct MyClass{public fixed int x[5];}),其主要应用在托管代码和非托管代码互操作的情况,除此之外,我们一般使用托管数组。


41.优先选择DataSet,而不是使用自定义结构。
   Prefer DataSets to Custom Structures。
   如果我们要创建的集合是一个基于某些算法的、对性能要求严格的集合,或者必须有轻便的格式,则我们就要使用自定义结构,否则最好使用DataSet,尤其是类型化的DataSet。


42.利用特性简化反射。
   Utilize Attributes to Simplify Reflection.
   特性可以申明运行的意图,通过使用特性来标记一个元素,可以在运行时指示它的用处以及简化查找这个元素的工作(通过反射来判断类或成员上是否应有了某些特性,进而在实际运行中进行配置);通过使用特性来标记意图,就把大量的责任从开发者身上移到了编译器身上。

43.避免过度使用反射。
   Don't Overuse Reflection.
   使用反射,一个应用程序可以通过添加新的组件来更新功能,实现可动态配置的软件;但同时也带来安全性的问题(成员调用的参数和返回值是以System.Object类型存在的,我们必须在运行时确保这些类型是正确的)。反射应该只在某些调用目标不能清楚的用接口表示时才使用(e.g:.Net的数据绑定)。很多常规情况下很少用反射,而是使用类厂、委托以及接口来创建代码,这可以产生出更容易维护的系统。


44.为应用程序创建特定的异常类。
   Create Complete Application-Specific Exception Classes.
   让你的用户在写catch语句来处理错误时更简单,我们通常要自己创建不同的异常类。当且仅当对于错误有不同的行为要处理时,我们才应该创建不同的异常类(从ApplicationException继承而不是从Exception继承);可以通过提供所有基类支持的构造函数,来创建全功能的异常类;还可以使用InnerException属性来承载底层错误条件的所有错误信息。

 
文章来源:http://blog.csdn.net/happyhippy/archive/2007/04/09/1557696.aspx

转载于:https://www.cnblogs.com/happyhippy/archive/2007/04/09/710932.html

你可能感兴趣的:(Effective C# 摘录(5) - 使用框架)