Effective C# 使用成员初始化器而不是赋值语句

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

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.对同一个变量执行不同的初始化方式
  使用初始化语句的一个前提是:所有得构造函数都将为该变量设置同样的值。我们看下面的示例代码:
复制代码 代码如下:

class Employee
{
//声明变量的同时进行初始化
private List<Employee> empList = new List<Employee>();

public Employee()
{
}

public Employee(int size)
{
empList = new List<Employee>(size);
}
}

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

class Employee
{
//声明变量
private List<Employee> empList;

public Employee()
{
empList = new List<Employee>();
}

public Employee(int size)
{
empList = new List<Employee>();
empList = new List<Employee>(size);
}
}

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

class Employee
{
//声明变量
private List<Employee> empList;

public Employee()
{
empList = new List<Employee>();
}

public Employee(int size)
{
empList = new List<Employee>(size);
}
}

3.需要进行异常处理
  初始化器无法被try语句包裹。所以对象初始化器执行的过程中发生异常都会被传递到对象之外。如果在初始化对象的时候可能会抛出异常时我们应该将这部分代码放到构造函数中,对其进行异常处理。这样才能够实现必要的恢复性代码,以创建类型实例并以更友好的方式处理异常。

小节:
  成员初始化器是保证类型中成员变量都被初始化的最简单方法——在声明变量时就对其进行初始化,无论调用的是那个构造函数,初始化器都将会在所有构造函数之前执行。这种语法也避免了在添加新的构造函数时遗漏掉重要的初始化代码。所以,如果对于所有的构造函数某个成员变量的初始化值是一样的,那么就应该尽量使用初始化器语法。

相关文章

  • WPF引用MVVM框架与使用方法

    WPF引用MVVM框架与使用方法

    这篇文章介绍了WPF引用MVVM框架与使用方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • ASP.NET样板项目ABP框架的特性总结

    ASP.NET样板项目ABP框架的特性总结

    这篇文章主要介绍了ASP.NET样板项目ABP框架的特性总结,ABP框架基于ASP.NET框架,用于开发Web应用程序,需要的朋友可以参考下
    2016-06-06
  • ASP.NET Table 表格控件的使用方法

    ASP.NET Table 表格控件的使用方法

    使用 Table 控件可以在 ASP.NET 网页上创建服务器可编程的表格。如果要创建的是静态表格(运行时不会在其中添加或更改内容的表格),则应使用 HTML 表格,而不是 Table 控件。
    2016-04-04
  • asp.net UpdaeProgress的简单用法

    asp.net UpdaeProgress的简单用法

    这个控件相比其他控件,属性少 使用简单,就先把这个控件的一般使用方法简单纪录下
    2008-10-10
  • .NET正则表达式的最佳用法

    .NET正则表达式的最佳用法

    本文详细讲解了.NET正则表达式最佳用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • ASP.NET实现word文档在线预览功能代码

    ASP.NET实现word文档在线预览功能代码

    文档管理系统需要实现WORD能在线预览功能,以前觉得挺难的,经过一番研究发现,WORD自带的另存为可以保存为HTMl文件。
    2010-07-07
  • c#中常用的js语句

    c#中常用的js语句

    有时候在开发中,经常输出一些js与客户端实现交互,虽然说是c#的其实好多js的,需要的朋友可以收藏下。
    2010-04-04
  • Blazor路由与页面导航开发介绍

    Blazor路由与页面导航开发介绍

    这篇文章介绍了Blazor路由与页面导航开发,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • 常用C#关键字详解教程(比较全面)

    常用C#关键字详解教程(比较全面)

    学习C#很久了,但可能你也和我一样,总有那么一两个关键词,说不清楚它是什么意思,有什么用,那么这篇文章就带你一一讲解。
    2016-04-04
  • asp.net实例代码protected override void Render(HtmlTextWriter writer)

    asp.net实例代码protected override void Render(HtmlTextWriter wri

    把最终要输出的html压缩后再输出和最终输出前先存为html文件,如果发布最新信息了,可以打开一次default.aspx,然后他又会生成一次html
    2008-08-08

最新评论