Effective C#原则14:使用构造函数链

写构造函数是一个反复的工作。很多开发人员都是先写一个构造函数,然后 复制粘贴到其它的构造函数里,以此来满足类的一些重载接口。希望你不是这样 做的,如果是的,就此停止吧。有经验的C++程序可能会用一个辅助的私有方法 ,把常用的算法放在里面来构造对象。也请停止吧。当你发现多重构造函数包含 相同的逻辑时,取而代之的是把这些逻辑放在一个常用的构造函数里。你可以得 避免代码的重复的好处,并且构造函数初始化比对象的其它代码执行起来更高效 。C#编译器把构造函数的初始化识别为特殊的语法,并且移除预置方法中重复的 变量和重复的基类构造函数。结果就是这样的,你的对象最终执行最少的代码来 合理的初始化对象。你同样可以写最少的代码来把负责委托给一个常用的构造函 数。构造函数的预置方法充许一个构造函数调用另一个构造函数。这是一个简单 的例子:

public class MyClass
{
 // collection of data
 private ArrayList _coll;
 // Name of the instance:
 private string _name;
 public MyClass() :
  this( 0, "" )
 {
 }
 public MyClass( int initialCount ) :
  this( initialCount, "" )
 {
 }
 public MyClass( int initialCount, string name )
 {
  _coll = ( initialCount > 0 ) ?
   new ArrayList( initialCount ) :
   new ArrayList();
  _name = name;
 }
}

C#不支持带默认值的参数,C++是很好 的解决这个问题的(译注:C++可以让参数有默认的值,从而有效的减少函数的重 载)。你必须重写每一个特殊的构造函数。对于这样的构造函数,就意味着大量 的代码重复工作。可以使用构造函数链来取代常规的方法。下面就是一些常规的 低效率的构造函数逻辑:

public class MyClass
{
  // collection of data
 private ArrayList _coll;
 // Name of the instance:
 private string _name;
 public MyClass ()
 {
  commonConstructor( 0, "" );
 }
 public MyClass( int initialCount )
 {
   commonConstructor( initialCount, "" );
 }
  public MyClass( int initialCount, string Name )
 {
   commonConstructor( initialCount, Name );
 }
 private void commonConstructor( int count,
  string name )
 {
   _coll = (count > 0 ) ?
   new ArrayList(count) :
    new ArrayList();
  _name = name;
 }
}

时间: 2024-12-02 16:01:48

Effective C#原则14:使用构造函数链的相关文章

Effective C#原则13:用静态构造函数初始化类的静态成员

(译注:initializer在上文中译为了"初始化器",实在不好听 ,本文中全部改译为:"预置方法") 你应该知道,在一个类 型的任何实例初始化以前,你应该初始化它的静态成员变量.在里C#你可以使用 静态的预置方法和静态构造函数来实现这个目的.一个类的静态构造函数是一个 与众不同的,它在所有的方法,变量或者属性访问前被执行.你可以用这个函数 来初始化静态成员变量,强制使用单件模式,或者实现其它任何在类型的实例可 用前应该完成的工作.你不能用任何的实例构造函数,其它

Effective C#原则43:请勿滥用反射

创建二进制的组件时,同时也意味着你要使用迟后绑定和反射来查找你所须 要的具有特殊功能代码.反射是一个很有力的工具,而且它让你可以写出可动态 配置的软件.使用反射,一个应用程序可以通过添加新的组件来更新功能,而这 些组件是在软件最开始发布时没有的.这是有利的. 这一伸缩性也带来 了一些复杂的问题,而且复杂问题的增加又会增加出现其它问题的可能.当你使 用反射时,你是围绕着C#的安全类型.然而,成员调用的参数和返回值是以 System.Object类型存在的.你必须在运行时确保这些类型是正确的.简单的

Effective C#原则35:选择重写函数而不是使用事件句柄

很多.Net类提供了两种不同的方法来控制一些系统的事件.那就是,要么添 加一个事件句柄:要么重写基类的虚函数.为什么要提供两个方法来完成同样的 事情呢?其实很简单,那就是因为不同的情况下要调用为的方法.在派生类的内 部,你应该总是重写虚函数.而对于你的用户,则应该限制他们只使用句柄来响 应一些不相关的对象上的事件. 例如你很了一个很不错的Windows应用程 序,它要响应鼠标点下的事件.在你的窗体类中,你可以选择重写OnMouseDown ()方法: public class MyForm :

Effective C#原则12:选择变量初始化而不是赋值语句

(译注:根据我个人对文章的理解,我把initializer译为:初始化器,它是 指初始化语法,也就是在一个类里声明变量的同时,直接创建实例值的方法. 例:object m_o = new object();如果这段代码不在任何函数内,但在 一个类里,它就是一个初始化器,而不管你是把它放在类的开始还以结尾.) 一些类经常不只一个构造函数.时间一长,就难得让它的成员变量以及 构造函数进行同步了.最好的确保这样的事不会发生的方法就是:在声明就是的 时间就直接初始化,而不是在每个构造函数内进行赋值.而且

Effective C#原则10:明白GetHashCode()的缺陷

这是本书中唯一一个被一整个函数占用的原则,你应该避免写这样的函数. GetHashCode()仅在一种情况下使用:那就是对象被用于基于散列的集合的关键 词,如经典的HashTable或者Dictionary容器.这很不错,由于在基类上实现的 GetHashCode()存在大量的问题.对于引用类型,它可以工作,但高效不高:对 于值类型,基类的实现经常出错.这更糟糕.你自己完全可以写一个即高效又正 确的GetHashCode().没有那个单一的函数比GetHashCode()讨论的更多,且令人 困惑

深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)_javascript技巧

前言 在第12章关于变量对象的描述中,我们已经知道一个执行上下文 的数据(变量.函数声明和函数的形参)作为属性存储在变量对象中. 同时我们也知道变量对象在每次进入上下文时创建,并填入初始值,值的更新出现在代码执行阶段. 这一章专门讨论与执行上下文直接相关的更多细节,这次我们将提及一个议题--作用域链. 英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-4-scope-chain/ 中文参考:http://www.denisdeng.com/?p

Effective C#原则50:了解ECMA标准

ECMA标准是C#语言所有功能的官方说明.ECMA-334定义了C#语言1.0的标准, 你可以从The C# Programming Language这本书上学习C#2.0的计划(译注:现在 已经不是计划了),这本书的作者是Anders Hejlsberg, Scott Wiltamuth, 和 Peter Golde (Addison-Wesley, 2003).这本书是一个语言手册,而不是指南. 它详细说明了这门语言书面定义的每一个功能.每一种语言都只一种标记,可以 让你更加明白每一种语言的

Effective C#原则48:了解更多的工具和资源

对于C#以及.Net来说这是激动人心的时候.这些工具目前还是比较新的,整 个社区都在学习如何使用这些工具.一些资源可以帮助你提高你的知识,以及为 .Net和C#创建一个更大的知识社区.这些工具是我每天都向C#开发人员推荐的. 关于C#实践的全部内容还在写作当中,跟进它们而且不断了解相关的内容. 第一个应该在每一个C#开发人员的工具箱的工具是NUnit, 它可以在 www.nunit.org网站上找到.NUnit是一个自动进行单元测试的工具,功能和 JUnit很像.和其它大多数开发人员一样,我讨厌

Effective C#原则47:选择安全的代码

.Net运行时已经设计好了,一些怀有恶意的代码不能渗透到远程计算机上并 执行.目前一些分部式系统依懒于从远程机器上下载和执行代码.如果你可以通 过Internet或者以太网来发布你的软件,或者直接从web上运行,但你须要明白 CRL在你的程序集中的一些限制.如果CLR不是完全相信一个程序集,它会限制一 些的行为.这些调用代码要有访问安全认证(CAS).从另一方面来说,CLR强制要 求基于角色的安全认证,这样这些代码才能或者不能在基于一个特殊的角色帐号 下运行. 安全违例是运行时条件,编译器不能强