当前位置 > 首页 > Asp.net

《Effective C#》读书笔记——条目12:推荐使用成员初始化器而不是赋值语句<.NET资源管理>

11/6/2012 10:06:00 PM来源:Asp.net

  一般情况下,一个类都会有多个构造函数。随着时间的推移,成员变量、构造函数不断增加。为了处理这种情况最方便的办法就是:在声明变量的时候进行初始化,而不是在每个构造函数中进行。无论是类成员(静态变量)合适实例变量,我们都应该充分利用初始化器的语法。

  C#编程在,一般在声明一个变量的同时我们会对其进行初始化:

1 class Employee
2 {
3 private List<Employee> empList = new List<Employee>();
4 }

不论我们为Employee类添加了多少个构造函数,empList变量都能够被正确的初始化,这是因为:

编译器会在所有构造函数(包括默认构造函数)的最开始位置生成代码来执行你为实例成员变量定义的所有初始化器;所以我们不需要再构造函数中为每一个定义的成员变量添加初始化代码——直接在声明的时候初始化即可。

  初始化器可以看做是构造函数中初始化语句的另一种表示。初始化器生成的代码会插入到构造函数代码前面执行。初始化器将在为类型执行调用基类构造函数之前执行,其顺序与类成员变量声明的顺序一样。

  C#的初始化器语法是一种最简单的、能够避免类型中存在未初始化变量的解决办法。但是在下面的三种情况下应该避免使用初始化器:

1.初始化对象为0或null时

   因为系统默认的初始化会将会在所有代码执行前把一切都设置成0或者null(值类型和引用类型)。而且这一步的操作是位于很底层的实现,我们也可以直接将对象赋值设置为0或null,但是显然这是多余的。

 

2.对同一个变量执行不同的初始化方式

   使用初始化语句的一个前提是:所有得构造函数都将为该变量设置同样的值。我们看下面的示例代码:

1 class Employee
2 {
3 //声明变量的同时进行初始化
4 private List<Employee> empList = new List<Employee>();
5
6 public Employee()
7 {
8 }
9
10 public Employee(int size)
11 {
12 empList = new List<Employee>(size);
13 }
14 }

 

在上面的代码中,当我们调用第二个构造函数创建初始化指定大小的泛型集合时 ,实际上时创建了两个List<Employee>。第一个创建后马上变成了垃圾——这是由于初始化器将在所有构造函数之前执行。编译器生成的代码类似于下面的这段代码:

1 class Employee
2 {
3 //声明变量
4 private List<Employee> empList;
5
6 public Employee()
7 {
8 empList = new List<Employee>();
9 }
10
11 public Employee(int size)
12 {
13 empList = new List<Employee>();
14 empList = new List<Employee>(size);
15 }
16 }

 我们可以看到这样做会影响程序的效率,创建了不必要的对象,所以如果需要在不同的构造函数中执行不同的初始化方式时正确的做法应该是不适用初始化器,而是先声明变量,然后在构造函数中进行成员变量的初始化,如下:

1 class Employee
2 {
3 //声明变量
4 private List<Employee> empList;
5
6 public Employee()
7 {
8

  • Client side devevelopment in ASP.NET

    1/31/2009 8:31:00 PM

    We ASP.NET developers know how much of a pain it is writing javascript in any app we have today bec

  • 跨浏览器仿模式对话框的实现

    5/14/2007 10:13:00 AM

    模式对话框,可以很方便地在网页间传递数据,并且可以让用户进行线性操作,IE上的showModalDialog效果不错,但可惜其他浏览器又不支持,况且IE也远离了95%的市场占有率。网上有很多仿模式窗

  • SQL Server 中Inner join 和where的效率差异

    3/6/2007 3:32:00 PM

    今天,手头上正在作的一个项目,在生成报表时,客户感觉太慢,于是,各处检查,看可否提示效率。界面上的都改进了,提升不大。如是在SQL 语句上下功夫。(我这人比较懒,对简单的语句和查询都没有经过仔细优化

  • Laptop hunters ads hit a nerve

    4/7/2009 12:42:00 AM

    Have you watched the latest Microsoft “Laptop Hunters” ads?  They feature people shopping fo

  • Vista上的IIS7设置全攻略(续)之实现Asp.NET1.1的调试

    5/13/2007 9:47:00 PM

    突然间发现Vs2003无法在IIS7上面进行调试,首先是提示现在的localhost所在的区域在Internet区.所以很快我就把它加入到了信任站点区域,并且设置了自动以当前帐户登入.可是提示却成了

  • 使用TFS来自动部署站点和Window Service

    10/14/2009 6:35:00 AM

    摘要: 前言先问各位看官两个问题: 1. 你们用TFS么? 2. 你们做自动部署么?怎么做的?这写博客不同讲课,没法及时互动,那我只好自问自答一把了: 1. 用,当然用,按我了解的情况来看,源码管理

  • WPF/E Faster than Flash?

    3/14/2007 11:54:00 AM

    Been busy launching a new product for the last few months ( http://www.articulate.com/products/arti

  • [WPF] How to bind a control to a property defined in the Settings ?

    3/26/2009 5:52:00 PM

    Settings are a very powerful feature of .NET applications that allows developers to store some valu

  • 使用Spring.Net+NHibernate构建WCF应用

    7/12/2012 8:41:00 PM

    在企业级应用开发中,利用合适的框架针对不同项目构建相应的应用。Spring.Net作为Spring的.Net版本,具有很强大的应用。如:作为IoC容器、AOP处理框架、与NHibernate的集成、

  • 在WinForm应用程序中实现自动升级

    6/15/2007 11:13:00 PM

    摘要: 最近单位开发一个项目,其中需要用到自动升级功能。于是,我就想写一个自动升级的组件,在应用程序中,只需要引用这个自动升级组件,并添加少量代码,即可实现自动升级功能。因为我们的程序中可能包含多个