在写程序的时候,往往会出现为一个类型提供不同场景的构造函数,可能大多构造函数比较相似,而C#中又不允许缺省参数,因此构造函数的编写无疑是一个重复工作。但是使用Copy和Paste来完成构造函数的编写,有时候很难达到统一,尤其是当成员发生变化的时候。因此比较常见的替换方法就是为构造函数提供一个统一的成员函数来完成初始化工作。

例如:

public class MyClass

{

private int _Age;

private string _Name;

public MyClass( string Name)

{

InitMember( Name, 20 );

}

public MyClass( string Name, int Age )

{

InitMember( Name, Age );

}

/// <summary>

/// Init class members

/// </summary>

/// <param name="Name"></param>

/// <param name="Age"></param>

private void InitMember( string Name, int Age )

{

_Age = Age;

_Name = Name;

}

}

不过,在C#中提供了更为简明的方法,就是在构造函数初始化语句中调用另一构造函数,那么上面的形式可以改写为如下这样。

public class MyClass

{

private int _Age;

private string _Name;

public MyClass( string Name):this( Name, 20 )

{

}

public MyClass( string Name, int Age )

{

_Age = Age;

_Name = Name;

}

}

对于这两者来说,执行效率没有太大差别,但从代码质量而言,后者要好很多,而且会使代码看起来更清晰。

其次,对于基类的调用。由于成员函数不能调用基类的构造函数,所以对于第一种编写就比较困难,后者就简单多了。

例如:

public class MyClass:BaseClass

{

private int _Age;

private string _Name;

public MyClass( string Name):this( Name, 20 )

{

}

public MyClass( string Name, int Age ):base( Name, Age )

{

_Age = Age;

_Name = Name;

}

}

这里要提的一点就是构造函数初始化语句,对于“this”或者“base”之类的调用只能有一个,不能并存。

最后,就是对于readonly常量的初始化,由于readonly常量只能通过成员初始化语句或者在构造函数中被修改,因此在成员函数中无法修改readonly常量,这也是构造函数初始化语句要比成员函数好的重要一个因素。

有了上面的说明,对于两者的对比,可以形成如下这个简单的对比表。

效率
 代码结构
 基类调用
 静态成员初始化
 
构造函数初始化语句
 一样
 简明清晰
 容易
 可以
 
成员函数
 比较清晰
 比较麻烦
 不能

(注:这里不提倡Copy/Paste方法来重复编写构造函数)

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Knight94/archive/2006/09/05/1179030.aspx

转载于:https://www.cnblogs.com/Sue_/articles/1656592.html

《Effective C#》Item 14:使用构造函数初始化语句相关推荐

  1. Effective JavaScript Item 33 让构造函数不再依赖newkeyword

    本系列作为EffectiveJavaScript的读书笔记. 在将function当做构造函数使用时,须要确保该函数是通过newkeyword进行调用的. function User(name, pa ...

  2. Effective C# 原则13:用静态构造函数初始化类的静态成员(译)

    Effective C# 原则13:用静态构造函数初始化类的静态成员 Item 13: Initialize Static Class Members with Static Constructors ...

  3. 读书笔记 effective c++ Item 18 使接口容易被正确使用,不容易被误用

    1. 什么样的接口才是好的接口 C++中充斥着接口:函数接口,类接口,模板接口.每个接口都是客户同你的代码进行交互的一种方法.假设你正在面对的是一些"讲道理"的人员,这些客户尝试把 ...

  4. 读书笔记 effective c++ Item 30 理解内联的里里外外 (大师入场啦)

    正文 最近北京房价蹭蹭猛涨,买了房子的人心花怒放,没买的人心惊肉跳,咬牙切齿,楼主作为北漂无房一族,着实又亚历山大了一把,这些天晚上睡觉总是很难入睡,即使入睡,也是浮梦连篇,即使亚历山大,对C++的热 ...

  5. 读书笔记 effective c++ Item 49 理解new-handler的行为

    1. new-handler介绍 当操作符new不能满足内存分配请求的时候,它就会抛出异常.很久之前,它会返回一个null指针,一些旧的编译器仍然会这么做.你仍然会看到这种旧行为,但是我会把关于它的讨 ...

  6. 关于嵌套循环的循环初始化语句问题:

    题目:使用嵌套循环计算1!+2!+3!+...+100! 关于循环初始化:自己起初认为变量循环初始化在外层循环外面和里面没有什么区别,就将其放在了外层循环里面.侥幸运行正常. 而书里提到这个循环初始化 ...

  7. 构造函数初始化结构体

    构造函数初始化结构体 虽然初始化列表易于使用,但它有两个缺点: 如果有某个成员未被初始化,那么在这种情况下,跟随在该成员后面的成员都不能初始化. 如果结构体包括任何诸如字符串之类的对象,那么在许多编译 ...

  8. [c++基本语法]——构造函数初始化列表

    c++构造函数初始化成员变量列表: 1 #pragma once 2 class Node 3 { 4 public: 5 int data; // 权值 6 Node *parent; // 父节点 ...

  9. 10.C++-构造函数初始化列表、类const成员、对象构造顺序、析构函数

    首先回忆下,以前学的const 单独使用const修饰变量时,是定义的常量,比如:const int i=1; 使用volatile const修饰变量时,定义的是只读变量 使用const & ...

最新文章

  1. ResNet网络的训练和预测
  2. ios 设置属性的center_IOS开发-常用UI控件的基本使用(Transform形变属性、frame属性、center属性的使用)...
  3. 2020年,产品经理如何提高求职成功率?
  4. JDK文档中关于Semaphore的正确使用以及使用场景
  5. diff git 代码实现_Git diff 算法
  6. 数据结构(七)排序---直接插入排序(稳定)
  7. 前端学习(2514):实战
  8. 给创业者的30条建议
  9. 改进初学者的PID-修改整定参数
  10. 解决win10系统下,git Bash闪退的问题
  11. 高精度加法(A+BProblemII)
  12. 2021年黑龙江高考成绩查询,黑龙江省招生考试信息港:2021年黑龙江高考成绩查询入口、查分系统...
  13. loadrunner 运行脚本-Run-time Settings之Preferences设置
  14. Could not resolve placeholder jdbc.driver in string value ${jdbc.driver}
  15. 这一刻只想好好做个平凡的人
  16. fluidsim元件库下载_FluidSIM下载
  17. 桌面虚拟化 | 同VDI扭打,IDV要如何补齐短板?
  18. 在google提交sitemap地图后的蜘蛛爬取效果
  19. 马云控股“中国文化”什么暗藏玄机?
  20. android 截图模糊,Adobe XD导出图片模糊?设置错误啦(切图详解)

热门文章

  1. 颠覆世界的新技术:区块链
  2. 帮助 Medium 阅读时间达到 2600 年的技术栈
  3. [摘录]第10章 培养胜过对手的力量
  4. java 实现二分法
  5. FineUI小技巧(3)表格导出与文件下载
  6. 联想终成全球PC第一
  7. 使用Visual Studio 部署SharePoint时提示“路径中具有非法字符”
  8. Android 基本控件使用
  9. erp生产管理系统排名_仁和ERP软件企业管理系统如何提高生产管理
  10. python 执行js_Python爬虫之记录一次下载验证码的尝试