一、构造函数

  构造函数是类的特殊方法,它永远不会返回值(即使是void),并且方法名和类名相同,同样支持重载。在使用new关键字创建对象时构造函数被间接调用,为对象初始化字段和属性的值。

  无参构造函数即默认构造函数,在我们没有创建任何构造函数时,编译器会为我们创建一个默认构造函数,反之当我们创建了任何构造函数,编译器不会为我们创建默认构造函数。

  下面我们设计一个无构造函数的空调类,一个无默认构造函数的空调类和一个有多个构造函数的空调类,并实例化它们。

 /// <summary>
/// 空调Air
/// </summary>
public class Air
{
#region 构造函数
//默认构造函数的结构
//public Air() { }
#endregion #region 字段
/// <summary>
/// 空调温度
/// </summary>
public int temperature; /// <summary>
/// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
/// </summary>
public int verticalDirection; /// <summary>
/// 空调开关(用int量化开关,0代表关,1代表开)
/// </summary>
public int switch_C;
#endregion
}
/// <summary>
/// 空调AirOther
/// </summary>
public class AirOther
{
#region 构造函数
/// <summary>
/// 一个参数构造函数
/// </summary>
/// <param name="num"></param>
public AirOther(int num)
{
//verticalDirection和switch_C会被设置为默认值0。
temperature = num;
} /// <summary>
/// 多参构造函数
/// </summary>
/// <param name="openOrClose">0代表关,1代表开</param>
/// <param name="upOrdown">0代表下,1代表中下,2代表中,3代表中上,4代表上</param>
/// <param name="num">空调温度</param>
public AirOther(int openOrClose, int upOrdown, int num)
{
temperature = num;
verticalDirection = upOrdown;
switch_C = openOrClose;
}
#endregion #region 字段
/// <summary>
/// 空调温度
/// </summary>
public int temperature; /// <summary>
/// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
/// </summary>
public int verticalDirection; /// <summary>
/// 空调开关(用int量化开关,0代表关,1代表开)
/// </summary>
public int switch_C;
#endregion
}
/// <summary>
/// 空调AirConditioner
/// </summary>
public class AirConditioner
{
#region 构造函数
/// <summary>
/// 无参构造函数
/// </summary>
public AirConditioner()
{
temperature = ;
verticalDirection = ;
switch_C = ;
} /// <summary>
/// 一个参数构造函数
/// </summary>
/// <param name="num"></param>
public AirConditioner(int num)
{
//verticalDirection和switch_C会被设置为默认值0。
temperature = num;
} /// <summary>
/// 多参构造函数
/// </summary>
/// <param name="openOrClose">0代表关,1代表开</param>
/// <param name="upOrdown">0代表下,1代表中下,2代表中,3代表中上,4代表上</param>
/// <param name="num">空调温度</param>
public AirConditioner(int openOrClose, int upOrdown, int num)
{
temperature = num;
verticalDirection = upOrdown;
switch_C = openOrClose;
}
#endregion #region 字段
/// <summary>
/// 空调温度
/// </summary>
public int temperature; /// <summary>
/// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
/// </summary>
public int verticalDirection; /// <summary>
/// 空调开关(用int量化开关,0代表关,1代表开)
/// </summary>
public int switch_C;
#endregion
}
/// <summary>
/// 实现对象
/// </summary>
public class RealizeObject
{
public void Realize()
{
//Air类无构造函数,创建airNotConstructor对象时会调用默认构造函数为它的所有int型字段赋默认值0。
Air airNotConstructor = new Air(); //AirOther类不能使用new AirOther()创建对象,因为当我们创建了任何构造函数后,编译器不会为我们创建默认构造函数,此时如果想使用默认构造函数应显示创建。
//AirOther airNotDefaultConstructor = new AirOther(); //在创建对象air过程中,调用的是AirConditioner类的无参构造函数,它为air的字段赋如下代码的值:
//air.temperature = 28;
//air.verticalDirection = 3;
//air.switch_C = 0;
AirConditioner air = new AirConditioner(); //在创建对象airOne过程中,调用的是AirConditioner类的一个参数构造函数,它为对象的temperature赋值21,其他两个int型字段被赋默认值0。
AirConditioner airOne = new AirConditioner(); //在创建对象airOpen18过程中,调用的是AirConditioner类的多参构造函数,并赋对应字段传入的值。
AirConditioner airOpen18 = new AirConditioner(, , );
}
}

  默认构造函数为数据类型赋默认值如下:

  bool类型设置为false,

  数值类型设置为0或者0.0,

  char类型设置为单个空字符,

  DataTime类型设置为1/1/0001 12:00:00 AM,

  对象引用(包括string)设置为null。

二、this关键字

  this关键字的作用之一是代表当前类,在方法的参数名与类的字段或属性名相同时,通过this.XXX代表类的字段或属性名,与方法的参数名区分开来。this关键字的作用之二是简化多构造函数中冗余的逻辑代码。

 /// <summary>
/// 洗衣机的类
/// </summary>
public class WashingMachine
{
/// <summary>
/// 时长(单位:分钟)
/// </summary>
public int duration; /// <summary>
/// 衣物的总数量
/// </summary>
public int clothesNum; public WashingMachine() { } public WashingMachine(int duration)
{
if (duration > )
{
duration = ;
}
//通过this关键字区分类的字段名与构造函数的参数名
this.duration = duration;
} public WashingMachine(int duration, int clothesNum)
{
if (duration > )
{
duration = ;
}
//通过this关键字区分类的字段名与构造函数的参数名
this.duration = duration;
this.clothesNum = clothesNum;
}
}

使用构造函数给洗衣机时长赋初始值时,超过60分钟的时长统一等于60分钟,此时多构造函数逻辑代码冗余。通过构造函数链的方式,以最多参数的构造函数为主函数,让其他构造函数通过最多参数的构造函数来初始化数据。

 /// <summary>
/// 洗衣机的类
/// </summary>
public class WashingMachine
{
/// <summary>
/// 时长(单位:分钟)
/// </summary>
public int duration; /// <summary>
/// 衣物的总数量
/// </summary>
public int clothesNum; public WashingMachine() { } public WashingMachine(int duration) : this(duration, ) { } public WashingMachine(int clothesNum) : this(, clothesNum) { } public WashingMachine(int duration, int clothesNum)
{
if (duration > )
{
duration = ;
}
//通过this关键字区分类的字段名与构造函数的参数名
this.duration = duration;
this.clothesNum = clothesNum;
}
}

注意:当调用构造函数WashingMachine(int duration)时,会先进入主构造函数,主构造函数执行完成后,会返回到WashingMachine(int duration)构造函数执行其代码。

C#类型成员:构造函数的更多相关文章

  1. 【.net 深呼吸】细说CodeDom(5):类型成员

    前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...

  2. java类定义、变量类型、构造函数

    1.java类class的定义 所有java程序都以类class为组织单元,java类由属性和方法组成,下面看例子: public  class  Phone{ //属性 String company ...

  3. NET设计规范二:类型成员设计

    http://www.cnblogs.com/yangcaogui/archive/2012/04/20/2459567.html 接着 → .NET设计规范一:设计规范基础 上一篇,我们来了解下类型 ...

  4. C++ static、const和static const类型成员变量声明以及初始化

    C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. sta ...

  5. C#反射与特性(五):类型成员操作

    目录 1,MemberInfo 1.1 练习-获取类型的成员以及输出信息 1.2 MemberType 枚举 1.3 MemberInfo 获取成员方法并且调用 1.4 获取继承中方法的信息(Decl ...

  6. F2工作流引擎参与者类型成员的交、并、互拆计算规则

          计算描述:计算规则指的是和其它“参与者类型成员”的之间的计算,必须求解处理人不为空的情况下才进行规则计算,各个“参与者类型成员”按序号顺序执行. 计算算法:并集(权重最低),交集(权重中) ...

  7. 请为CMyString类型编写构造函数、copy构造函数、析构函数和赋值运算符函数。

    如下为类型CMyString的声明,请为该类型编写构造函数.copy构造函数.析构函数和赋值运算符函数. class CMyString { public: CMyString(const char* ...

  8. c++ string类型成员变量在调用构造函数后未能正确赋值

    struct RelItem{ string segName; Elf32_Rel* rel; string relName; RelItem(string seg, int addr, string ...

  9. 【原】结构体包含CString类型成员变量出错的原理

    问题如下:我定义了如下的一个结构体: typedef struct{   CString csText;}MyStruct; 并有如下的程序段1:MyStruct * p=NULL;p=(MyStru ...

随机推荐

  1. golang字节数组拷贝BlockCopy函数实现

    在C#中,Buffer.BlockCopy(Array, Int32, Array, Int32, Int32) 函数使用比较广泛,其含义: 将指定数目的字节从起始于特定偏移量的源数组复制到起始于特定 ...

  2. ASP.NET,C#后台调用前台javascript的五种方法

    C#后台调用前台javascript的五种方法 由于项目需要,用到其他项目组用VC开发的组件,在web后台代码无法访问这个组件,所以只好通过后台调用前台的javascript,从而操作这个组件.在网上 ...

  3. The Rise of Meta Learning

    The Rise of Meta Learning 2019-10-18 06:48:37 This blog is from: https://towardsdatascience.com/the- ...

  4. Ubuntu 16.04.4 LTS下安装OpenSSL

    1.下载openssl,本次下载的版本是openssl-1.1.0l.tar.gz : 地址  https://www.openssl.org/source/openssl-1.1.0l.tar.gz ...

  5. Token 安全登陆防止窃取

    HTTP 协议是无状态的 在web中使用cookie+session的技术来保持用户登陆的状态 移动端使用token来保持用户登陆状态由于token在网络中传输,很容易被 中间人获取,进而模拟用户进行 ...

  6. Linux shell字符串操作

    #!/bin/bash #镜像名 image="asr-server" #镜像版本 ver="5.2.1" #容器名 dname="asr" ...

  7. LeetCode 101. Symmetric Tree(镜像树)

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

  8. (原)ffmpeg中的writing_filter翻译

    本文的主要目的是梳理,记录自己在学习开发ffmpeg视频滤镜的笔记.参考的主要内容是根据ffmpeg中doc下的writing_filter.txt文件以及ffmpeg的源码. author:liha ...

  9. VLOOKUP使用方法

    VLOOKUP函数是常用的一个内容查找函数,用于通过某一条件查询数据源中需要的内容.语法:=VLOOKUP(查询值,数据源,显示序列,匹配参数)1)查询值:匹配的key值2)数据源:查找范围,1)起点 ...

  10. EasyNVR摄像机网页无插件直播方案H5前端构建之:bootstrap弹窗功能的实现方案与代码

    前言介绍 在web前端的网页设计中,为了展示出简洁的网页风格和美观的效果,往往会使用弹窗效果在EasyNVR前端页面录像检索功能时,必然会播放录像,如果单独为播放录像文件排一个界面,用户在使用上会更加 ...