Effective C# 摘录(3) - 使用C#表达设计

简介:

19:定义并实现接口优于继承类型。
   Prefer Defining and Implementing Interfaces to Inheritance。
   接口支持多重继承,可以作用于值类型,而抽象类则不可以;抽象类中可以定义字段或方法,减轻创建子类(复用)的同时增加了子类与父类之间的耦合度;子类继承接口表达的是“can-do”的关系,而子类继承抽象类表达的是“is-a”的关系。

20:明辨接口实现和虚方法重写。
   Distinguish Between Implementing Interfaces and Overriding Virtual Functions。
   派生类不能重载基类(继承接口)中的接口成员。

21:使用委托表达回调
   Express Callbacks with Delegates 
   返回值总是委托链上最后一个函数调用后返回的值;在委托链中抛出的任何异常都会终止委托链的继续调用。

22:使用事件定义对外接口。
   Define Outgoing Interfaces with Events。
   观察者模式(Observer Pattern).

23:避免返回内部类对象的引用。
   Avoid Returning References to Internal Class Objects。
   四个策略来保护类的内部数据结构不被无意的修改:值类型,恒定类型,接口和包装(模式)(e.g:返回DataView而不是DataSet)。

24:声明式编程优于命令式编程.
   Prefer Declarative to Imperative Programming.
   在C#中,编程时使用特性(Attribute)就是申明式编程。使用特性来表明意图时,可以减少在大量类似的手写算法中出现逻辑错误的可能。

25:尽可能将类型实现为可序列化的类型.
   Prefer Serializable Types.
   BinaryFormatter和SoapFormatter反序列化不会调用构造函数和属性访问器(property Set/Get)(如果有的话),且能够序列化非public成员;而XML反序列化会调用构造函数和属性访问器(如果有的话),且只能够序列化public属性和字段。
   尽可能的使用默认序列化特性([SerializableAttribute]),当默认特性不满足时(e.g:在不同版本之间转换)要实现ISerializable 接口。

26:使用IComparable和IComparer接口实现排序关系。
   Implement Ordering Relations with IComparable and IComparer.
   IComparable是以提供方法来比较两个特定类型的对象;IComparer可以为排序提供一个可选的排序依据,这可以用于一些没有给你提供排序依据的类型上,提供你自己的排序依据。
   e.g:http://support.microsoft.com/kb/320727/

27:避免ICloneable接口.
   Avoid ICloneable.
   对于值类型,不应该实现ICloneable接口,而应该使用赋值语句。对于引用类型,只有在确实必要进行拷贝时,才在子类上实现对ICloneable的支持;基类在可能要对ICloneable进行支持时,应该创建一个受保护的构造函数。总之,我们应该尽量避免使用ICloneable接口。

28:避免强制类型转换操作符。
   Avoid Conversion Operators.
   通过构造函数来代替定义类型转换操作。

29:只有当强制更新基类导致问题时才考虑使用new修饰符。
   Use the new Modifier Only When Base Class Updates Mandate It.
   在子类的方法上使用new修饰符,只是隐藏了从父类继承而来的方法,而并不是重写覆盖,因此在子类的方法表中,存在两个方法槽(slot)。当子类的引用调用该方法时,是调用子类中定义的方法;而当子类转化为父类的引用时,是调用父类中定义的方法!(关于这一点,也可以参考下我以前写的《
Child类调用GrandFather类方法引发的思考》)。因此一般避免在方法上使用new修饰符。 



本文转自Silent Void博客园博客,原文链接: http://www.cnblogs.com/happyhippy/archive/2007/03/20/681428.html ,如需转载请自行联系原作者
相关文章
表达式树练习实践:C# 五类类运算符的表达式树表达
表达式树练习实践:C# 五类类运算符的表达式树表达
123 0
|
6月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
198 3
|
18天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
30 3
|
1月前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。
112 0