C#类型成员:构造函数
一、构造函数
构造函数是类的特殊方法,它永远不会返回值(即使是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#类型成员:构造函数的更多相关文章
- 【.net 深呼吸】细说CodeDom(5):类型成员
前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...
- java类定义、变量类型、构造函数
1.java类class的定义 所有java程序都以类class为组织单元,java类由属性和方法组成,下面看例子: public class Phone{ //属性 String company ...
- NET设计规范二:类型成员设计
http://www.cnblogs.com/yangcaogui/archive/2012/04/20/2459567.html 接着 → .NET设计规范一:设计规范基础 上一篇,我们来了解下类型 ...
- C++ static、const和static const类型成员变量声明以及初始化
C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. sta ...
- C#反射与特性(五):类型成员操作
目录 1,MemberInfo 1.1 练习-获取类型的成员以及输出信息 1.2 MemberType 枚举 1.3 MemberInfo 获取成员方法并且调用 1.4 获取继承中方法的信息(Decl ...
- F2工作流引擎参与者类型成员的交、并、互拆计算规则
计算描述:计算规则指的是和其它“参与者类型成员”的之间的计算,必须求解处理人不为空的情况下才进行规则计算,各个“参与者类型成员”按序号顺序执行. 计算算法:并集(权重最低),交集(权重中) ...
- 请为CMyString类型编写构造函数、copy构造函数、析构函数和赋值运算符函数。
如下为类型CMyString的声明,请为该类型编写构造函数.copy构造函数.析构函数和赋值运算符函数. class CMyString { public: CMyString(const char* ...
- c++ string类型成员变量在调用构造函数后未能正确赋值
struct RelItem{ string segName; Elf32_Rel* rel; string relName; RelItem(string seg, int addr, string ...
- 【原】结构体包含CString类型成员变量出错的原理
问题如下:我定义了如下的一个结构体: typedef struct{ CString csText;}MyStruct; 并有如下的程序段1:MyStruct * p=NULL;p=(MyStru ...
随机推荐
- 部署oVirt4.2+Gluster超融合架构
首先下载最新ovirt-node iso镜像 准备3台机器,配置为2核,16G内存,两块硬盘,1块100G装系统,1块300G做存储 node1.com(192.168.105.221) node2. ...
- [技术博客]Android 开发 Bug Log
[技术博客] Android 开发 Bug Log 大大小小的bug,聪明的愚蠢的都有, 持续记录中...... java.lang.IllegalArgumentException: The sty ...
- poi导出word表格跨行
DataCommon.java package com.ksource.pwlp.model.statistic; public class DataCommon { private Long id; ...
- java中为什么notify()可能会导致死锁,而notifyAll()则不会
简单的说,notify()只唤醒一个正在等待的线程,当该线程执行完以后施放该对象的锁,而没有再次执行notify()方法,则其它正在等待的线程 则一直处于等待状态,不会被唤醒而进入该对象的锁的竞争池, ...
- ARM 链接脚本分析
分析连接脚本的语法规则 /* ---------------------------------------------------------------------------- * Memory ...
- Qt组件(例如按钮、树形控件)上响应鼠标右键
ui->textEdit->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->textEdit,SIGNAL(cust ...
- Qt编写安防视频监控系统18-云台控制
一.前言 云台控制是视频监控系统中必备的一个功能,对球机进行上下左右的移动,还有焦距的控制,其实核心就是控制XYZ三个坐标轴,为了开发这个模块,特意研究了各种云台控制的方法和开源库比如soap,有些厂 ...
- {Redis}NOAUTH Authentication required. Linux.cenOS
问题 [root@VM_0_12_centos redis]# ./bin/redis-cli -p 6379 127.0.0.1:6379> INFO NOAUTH Authenticatio ...
- Django框架 + Djiango安装 + First Djiango + 常用命令
一.Django框架 MVC框架和MTV框架 参考:https://www.cnblogs.com/taosiyu/p/11260016.html MVC,全名是Model View Controll ...
- CentOS / RHEL 内核升级
1. 查看当前内核版本 [root@192.168.118.11 ~]#cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) [ro ...