当前位置 > 首页 > 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

  • ASP.NET MVC+Spring.net+Nhibernate+EasyUI+Jquery开发案例(2)

    5/25/2012 10:44:00 AM

    接着昨天的继续吧,我们的完美征程继续开始。昨天我们完成了MVC里面的Dao层的设计,在上面我们已经实现了操作数据库的代码,在这个项目中我实现了User_DepInfo表的增删改查和模糊查询,是基于E

  • .Net读取XP文件夹中的Thumbs.db文件

    1/21/2010 1:01:00 AM

    阅读: 354 评论: 1 作者: donjuan 发表于 2010-01-20 21:03 原文链接 一般在 XP 文件夹里面,特别是图片和视频文件夹里有一个文件 —Thu

  • Code Generation using LINQ Expression Trees and .NET 3.0

    3/4/2007 11:39:00 PM

    via this thread on theServerSide I found this very interesting blog which talks a lot about C#

  • DNN详解(1)-Web.Config

    8/24/2007 8:15:00 PM

    多年以来,还是觉得 DNN 是一个非常出色的框架,非常实用的框架。 在熟悉 Web.Config 的过程中,我们可能会涉及很多其他方面的知识,不过大家可以去 Google

  • C#类和接口、虚方法和抽象方法及值类型和引用类型的区别

    4/19/2009 1:21:00 PM

    摘要: 1.C#类和接口的区别接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,

  • ASP.NET 自定义控件从入门到精通3补充

    4/20/2009 1:46:00 AM

    摘要: ASP.NET 自定义控件从入门到精通3 状态管理和Style类3.2 新的Render方法源码下载 首先我们来看看Register控件在前台生成的Html代码,代码如下所示:<!—

  • 为WPF程序中的数据(Model)添加编辑功能

    12/7/2009 3:11:00 AM

    阅读: 58 评论: 0 作者: donjuan 发表于 2009-12-07 00:23 原文链接 WPF 的数据绑定是一个很强大的功能, TwoWay 的绑定模式,让程序员不用编写一行

  • HubbleDotNet 开源全文搜索数据库项目--内存索引

    8/10/2011 6:06:00 AM

    经过2周多的努力,HubbleDotNet 的内存索引功能终于搞好了。有了内存索引,搜索不再去读硬盘,实时性大大提高了。hubble的内存索引不同于lucene 的内存索引,本文将具体介绍一下hub

  • 从PHP安全讲DedeCms的安全加固

    9/26/2009 10:22:00 PM

    摘要: 先来看看原因吧,为什么PHP程序经常出漏洞,其实是由PHP程序本身决定的。PHP可复用性低,导致程序结构错综复杂,到处是冗余代码,这样不仅利于漏洞的产生,还影响漏洞的修得;PHP程序入门简单

  • 期待以久的 extjs 3.0 已经发布了

    7/10/2009 8:51:00 AM

    1、Direct, CRUD and REST support for streamlined server communications 2、New Example