博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Effective C#》读书笔记——条目12:推荐使用成员初始化器而不是赋值语句<.NET资源管理>...
阅读量:7144 次
发布时间:2019-06-29

本文共 2519 字,大约阅读时间需要 8 分钟。

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

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

1     class Employee2     {3         private List
empList = new List
();4 }

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

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

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

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

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

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

 

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

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

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

 

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

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

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

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

 

3.需要进行异常处理

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

 

小节:

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

 

本文转自gyzhao博客园博客,原文链接:http://www.cnblogs.com/IPrograming/archive/2012/11/06/Effective_CSharp_12.html
,如需转载请自行联系原作者
你可能感兴趣的文章
python splinter 小坑说明
查看>>
控制input输入格式
查看>>
一次XEN启动中的错误捕获
查看>>
esxi嵌套华为Fusioncomputer安装VRM几个关键步骤。
查看>>
DNS设置引起的登录延迟
查看>>
saltstack之SLS文件
查看>>
JAVA构建缓存
查看>>
解决:Loading kernel module CAP_SYS_MODULE CAP_NET_ADMIN alias netdev-eth0 instead
查看>>
wav2letter-基于深度学习的语音识别
查看>>
Java class.forname()和newinstance
查看>>
学习计划书
查看>>
[iOS Animation]-CALayer 视觉效果
查看>>
wps的ppt放映时不能完全全屏的解决方法
查看>>
我的友情链接
查看>>
本地存储
查看>>
react-native环境配置入坑指南.
查看>>
使用qemu
查看>>
小试下新博客,一个列传行的SQL
查看>>
带你一分钟理解闭包--js面向对象编程
查看>>
MySql基本使用方法
查看>>