默认构造函数

声明基本构造函数的语法就是声明一个与类同名的方法,但该方法没有返回类型:

public class MyClass
{
public MyClass()
{
}
// rest of class definition
}

如果没有提供任何构造函数,编译器会在后台生成一个默认的构造函数。默认的构造函数,只能把所有的成员字段初始化为标准的默认值。

但是,如果定义了带参数的构造函数,编译器就不会自动提取默认的构造函数。

private或protected构造函数

可以把构造函数定义为private或Protected,这样就限制不相关的类不能访问它。

比如定义private,

public class MyNumber
{
private int _number;
private MyNumber(int number) // another overload
{
_number = number;
}
}

在外部代码中,不能使用new关键字实例化MyNumber;但可以编写一个公有静态属性或方法,以实例化该类,比如单例模式

public class Singleton
{
private static Singleton _instance;
private int _state;
private Singleton(int state) => _state = state;
public static Singleton Instance => _instance ?? (_instance = new Singleton(42));
}

构造函数中调用其他构造函数

class Car
{
private string _description;
private uint _nWheels;
public Car(string description, uint nWheels)
{
_description = description;
_nWheels = nWheels;
}
public Car(string description): this(description, 4)
{
}
// ...
}

通过this关键字调用另一个构造函数,这种语法称为构造函数初始化器。this关键字调用参数最匹配的那个构造函数。

注意,构造函数初始化器在构造函数的函数体之前执行。如:

var myCar = new Car("Proton Persona");

会先调用有两个参数的构造函数,然后调用只有一个参数的构造函数。

静态构造函数

C#可以给类定义无参数的静态构造函数,这种构造函数只执行一次。

静态构造函数只能访问类的静态成员,不能访问类的实例成员。

静态构造函数不能带任何参数,一个类也只能有一个静态构造函数。

在C#中,通常在第一次调用类的任何成员之前,执行静态构造函数。

public enum Color
{
White,
Red,
Green,
Blue,
Black
}

  

public static class UserPreferences
{
public static Color BackColor { get; }
static UserPreferences()
{
DateTime now = DateTime.Now;
if (now.DayOfWeek == DayOfWeek.Saturday || now.DayOfWeek == DayOfWeek.Sunday)
{
BackColor = Color.Green;
}
else
{
BackColor = Color.Red;
}
}
}

  

C#构造函数 -0028的更多相关文章

  1. .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]

    构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...

  2. javascript工厂模式和构造函数模式创建对象

    一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...

  3. JS继承之借用构造函数继承和组合继承

    根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...

  4. PHP与JAVA构造函数的区别

    早期的PHP是没有面向对象功能的,但是随着PHP发展,从PHP4开始,也加入了面向对象.PHP的面向对象语法是从JAVA演化而来,很多地方类似,但是又发展出自己的特色.以构造函数来说,PHP4中与类同 ...

  5. C++ 拷贝构造函数和赋值运算符

    本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...

  6. golang语言构造函数

    1.构造函数定义 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个 ...

  7. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  8. Aop动态生成代理类时支持带参数构造函数

    一.背景 在某些情况下,我们需要植入AOP代码的类并没有默认构造函数.那么此时动态生成的代理类也需要相同签名的构造函数,并且内部调用原始类的构造函数.自己折腾了1晚上没搞定,现在搞定了发出来供大家一起 ...

  9. C#的泛型的类型参数可以有带参数的构造函数的约束方式吗?

    Review后看到标题让我十分羞愧自己语文功底太差,估计...请见谅......我还特地把这句写回开头了...... 问题 前天遇到的一个问题,所以在MSDN发了个问,刚也丰富了下问题,关于泛型的. ...

随机推荐

  1. 上古神器vim系列之移动三板斧

    [导读] 前文总结了vim如何进入,如何保存退出,如何进入编辑模式.本文来总结一些稍微进阶的内容,在normal模式下如何高效的浏览代码. 模式回顾 在normal模式下主要用于浏览代码,那么有哪些方 ...

  2. Android 中加载本地Html 跨域问题,http协议允许加载

    一.需求: 后台加载HTML的包时间太长,太卡,让把所有的HTML包放到前台:使用的是file://协议,有些内容和样式加载不出来,H5那边说需要用http://协议来加载: 二.处理过程: 安卓最简 ...

  3. leetcode198之打家劫舍问题

    问题描述: 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给 ...

  4. PETS渗透测试标准总结

    国外的标准框架,感觉大部分渗透公司的测试指南都是从这俩借鉴的,正好复习下. 国外渗透测试标准:http://www.pentest-standard.org 渗透测试分为:前期交互,情报搜集,威胁建模 ...

  5. Linux题目

    1.删除某目录下所有文件,只保留指定文件. 例:假设/abc文件夹下有a1.a2....a10文件,保留a5和a6文件,其他全部删除 [root@localhost abc]# touch a{1.. ...

  6. 重学 Java 设计模式:实战适配器模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 擦屁屁纸80%的面积都是保护手的! 工作到3年左右很大一部分程序员都想提升自己的技术 ...

  7. Dubbo源码笔记-服务注册

    今天来简单做一下Dubbo服务注册部分源码学习手记. 一.Dubbo配置解析 目前Dubbo最多的用法就是跟Spring集成,既然跟Spring集成,那么,Dubbo对象的实例化都将交由Spring统 ...

  8. C#中值类型,引用类型,字符串类型的区别(内存图解)

    如果用图片来解释值类型,引用类型和字符串类型(引用类型的一种)的区别的话 值类型: 引用类型: string类型:

  9. Linux磁盘与文件系统管理概要

    Linux磁盘与文件系统管理 硬盘组成与分区 硬盘组成 圆形的盘片(主要记录数据) 机械手臂与磁头(可读取盘片上的数据) 主轴马达,转动盘片,让机械手臂的磁头在盘片上读取数据 扇区(Sector)为最 ...

  10. ASP.NET实现一个在线音乐统计网站(歌手,音乐,角色……增删改查)

    这里更多的是当作随身笔记使用,记录一下学到的知识,以便淡忘的时候能快速回顾 当前步骤是该项目的完结部分(前面由于没有时间整理了,直接发一个大完结吧) 第一部分 第二部分 源码已上传GitHub:这里有 ...