《Effective C#》:使用成员初始化语句

2016-02-19 14:10 2 1 收藏

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

【 tulaoshi.com - 编程语言 】

为了方便内容的开展,我先说说一个对象的构造过程。

  对于类型第一个实例的构造过程大致如下:

  1. 分配静态成员的内存空间,此时空间存储数据为0;

  2. 执行静态成员的初始化语句;

  3. 执行基类的静态构造函数;

  4. 执行类型的静态构造函数;

  5. 分配成员的内存空间,此时空间存储数据为0;

  6. 执行成员的初始化语句;

  7. 执行相应的基类构造函数;

  8. 执行类型的构造函数。

  那么对于同类型的后续创建对象,前4个步骤不用执行的,直接从第5步开始。

  现在来说说为什么推荐使用成员初始化语句来初始化成员。由于成员初始化先于构造函数的调用,所以更早初始化有利于使用;其次,避免对构造函数重复添加初始化代码,尤其是新增成员的时候,把初始化放到定义成员的位置,减少因构造函数之间的不一致,而造成某些成员未被初始化。而且把成员初始化从构造函数中抽出来,使代码显得更简洁明朗。

  例如:

public class MyList
{
 //Init class member here
  private ArrayList _List = new ArrayList();
}
  是不是所有的成员都可以这样进行初始化呢。事实上,有三种场景是不适合用这样的方式来完成成员初始化。

  第一种就是给成员赋给“0”或者“null”,这并不是错误语句,而是没有必要的。参看前面的对象构造过程,由于成员首先会被分配内存空间,并且同时已经用“0”进行初始化了。因此显式的赋值会增加指令操作,而影响效率。

  第二种就是根据不同参数来指明成员初始化的方式,而一般类似操作是放在构造函数中。如果使用成员初始化语句的话,那么在构造函数中重新初始化成员,就会生成一个短暂的临时对象。

  例如:

public class MyList
{
 //Init class member here

 private ArrayList _List = new ArrayList();
 public MyList()
 {}
 public MyList( int nSize )
 {
  _List = new ArrayList( nSize );
 }
}
  以上例子,如果通过“MyList( int nSize )”这个构造函数来创建对象,会先通过成员初始化来初始“_List”成员,然后在构造函数重新初始化此成员。那么实际上,会在内存中产生两个ArrayList对象,前一个已经成为垃圾,需要等待GC进行回收。对于这种情况,用如下的方式可能会更好。

public class MyList
{
 //Init class member here
 private ArrayList _List;

 public MyList()
 {
  _List = new ArrayList();
 }
 public MyList( int nCount )
 {
  _List = new ArrayList( nCount );
 }
}
  对于最后一种就是,由于通过成员初始化来初始化成员,在初始化语句地方是不能加入try-catch来捕获异常,因此在初始化过程中所出现的异常会被传递出去,为了保证程序的安全,则需要在调用端进行try-catch捕获。不过这样操作会使调用端的代码显得繁琐,更合理的做法,是在类型中对成员初始化进行异常处理,因此采用构造函数来初始化成员效果更好些。例如:

public class MyTest
{
 private TempObject _value;

 public MyTest()
 {
  try
  {
   _value = new TempObject();
  }
  catch( Exception err )
  {
    //Handle exception here
  }
 }
}
  对于成员初始化的好处以及其的使用限制,到此就已经说完了。不过,我个人更喜欢通过构造函数来初始化成员。对于文章中所说到的,使用构造函数来初始化成员的一些不利之处,例如:多个构造函数之间初始化操作的繁琐或者成员初始化的不统一,我觉得可以通过构造函数调用构造函数的方式来减少此类问题。不过这也只是我个人看法,至于具体用什么并没规定。

来源:http://www.tulaoshi.com/n/20160219/1606338.html

延伸阅读
标签: 电脑入门
在Windows通信端口初始化失败一般都有以下几种情况可以判断。情况如下: 1、在电脑开机之后,时间上需要六分钟左右才可以进入系统,或者更长。 2、在我们打开电脑之后,我们双击360图标的时候,电脑会提示Windows通信端口初始化失败 3、在输入命令中,输入netstat -an命令出现乱码。 4、如果是连接无线来上网的会发现无线上网也无法连接了...
标签: Web开发
为什么要初始化CSS?在webjx.com前面的文章中,我们讲过CSS初始化是指重设浏览器的样式。不同的浏览器默认的样式可能不近相同,所有开发时的第一件事可能就是如果把他们统一。 也许他们平时做页面时根本就没考虑过浏览器兼容的问题。其实不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面差异。...
标签: MySQL mysql数据库
  在开发数据库应用的过程难免会编写大量的SQL语句,其中大部份是查询语句;为不同情况编写查询语句是一件很烦琐的事件。用过hibernate或Nhibernate会了解到把SQL查询语句对象化后使用起非常方便和快捷;也大大减少在编写查询SQL语句所带来的错误等问题。        前段时间在编写一个数据处理类的时候同样遇...
ALTER DATABASE DATAFILEd:\ORANT\DATABASE\USER1ORCL.ORA RESIZE 1000M; CREATE TABLESPACE INDEX_DATA DATAFILEd:\ORANT\DATABASE\INDEX_DATA SIZE 500M; ALTER DATABASE DATAFILEd:\ORANT\DATABASE\RBS1ORCL.ORA RESIZE 300M; ALTER DATABASE DATAFILEd:\ORANT\DASTABASE\TMP1ORCL.ORA RESIZE 300M; alter rollback segment "RB1" offlin...
Windows应用程序的初始化文件(INI)对应用程序缺省设置起着重要的作用,初始化文件可以采用文本编辑器修改,但这种方法容易出现错误,不易由用户操作。下面介绍用VB实现修改初始化文件的方法。 1初始化文件的结构与特点 Windows应用程序初始化文件中通常设置应用程序的运行环境,确定应用程序变量的缺省设置,初始化文件既包含Win...

经验教程

140

收藏

77
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部