C# 构造器总结
在C#中,构造器分为实例构造器和类型构造器,
一、实例构造器
构造引用类型的对象时,在调用实例 构造器之前,为对象分配的内存总是归0,没有被构造器显示重写的字段都保证获得0或null的值
在一个类中,如果我们没有显示的定义任何构造器,那么C#编译器将定义一个默认的无参构造器,这个无参构造器会简单的调用一个基类的无参构造器,如下面SomeType类
public class SomeType
{
public SomeType() : base() { }
}
但是当我们基类中没有提供无参构造器怎么办呢,那么这时我们的派生类就必需显示的调用一个基类的构造器,否则编译器会报错。如果类的修饰符为static,编译器根本不会在类的定义中生成默认构造器。
在一个类型中我们是可以定义多个实例构造器的,但是每个构造器必须有不同的签名。
接下来我们再来谈谈实例构造器的执行,请看如下代码:
internal sealed class SomeType
{
private int m_x = ;
}
当我们构造SomeType类时,它的m_x字段被初始化为5,这是因为SomeType的构造器把5存储到字段m_x,再调用基类的构造器,最后调用了自己的构造器。如果你还不懂,请看下面这段代码:
internal sealed class SomeType
{
private int m_x = ;
private double m_d = 3.1415;
private byte m_b;
public SomeType(string s)
{
m_d = ;
}
}
当我们实例化类型时调用了SomeType(string s)这个构造器时,编译器生成的代码首先会初始化m_x、m_b和m_d的值,再调用基类的构造器,这里的基类就是object,最后再执自己的代码,所以最后三个字段的值为m_x = ,m_d =10,m_b=0;
说完了引用类型的实例构造器,我们再来谈谈值类型的构造器,个人认为值类型的构造器没有这么重要,只要记得几点就行:
1、CLR确实允许为值类型定义构造器,可以调用构造器来初始化值类型的字段,但必须显示调用才会执行。
2、C#编译器不允许值类型定义无参构造器,但是CLR允许,也就是说,我们可以使用另一种语言定义带有无参构造器的值类型。
二、类型构造器
除了实例构造器,CLR还支持类型构造器,也叫静态构造器、类构造器或者类型初始化器。
1、类型构造器默认没有定义,如果要定义,只能定义一个
2、类型构造器永远没有参数
3、必须标记为static,这也是它与实例构造器的区别
4、C#自动将其标为私有,用显示标记,否则会报错,之所以私有,是为了防止开发人员调用它,因为它的调用是CLR负责的。
5、类型构造器中的代码只能访问类型的静态字段,并且它的常规用途就是初始化这些字段。
C# 构造器总结的更多相关文章
- Java之类的构造器(反射)
反射: Java反射机制:指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法.这种动态获取类的内容以及动态调用对象的 ...
- Swift3.0P1 语法指南——构造器
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Duilib源码分析(二)控件构造器—CDialogBuilder
上一节了解了大体流程,但是界面控件元素是如何被加载.解析.构建.管理.控件消息如何处理的呢?接下来我们将结合控件构造器进行分析: CDialogBuilder:控件构造器,主要用以解析xml配置文件并 ...
- java面向对象_构造器
构造器(构造方法):是类中定义的方法. 1)常常用于给成员变量赋值: 2)与类同名,没有返回值类型,也不能写void: 3)在创建对象时被自动调用.所以构造方法的访问修饰符要用public,才能被自动 ...
- 静态工厂方法VS构造器
我之前已经介绍过关于构建者模式(Builder Pattern)的一些内容,它是一种很有用的模式用于实例化包含几个属性(可选的)的类,带来的好处是更容易读.写及维护客户端代码.今天,我将继续介绍对象创 ...
- 008-Scala主构造器、私有构造器、构造器重载实战详解
008-Scala主构造器.私有构造器.构造器重载实战详解 Scala主构造器实战 无参数的主构造器 分析 1.name 需要赋初值,一般通过占位符来代表空值 2.private 声明私有的age 生 ...
- 【Thinking in Java】编写构造器时应注意:尽量避免调用其他非private方法
最近重温了<Thinking in Java>,发现了一个让我为之兴奋的知识漏洞,必须得分享一下. 上一篇的<Java类初始化的过程>的随笔中,那个初始化顺序并不完整.初始化的 ...
- java构造器
java的构造器不是方法,因为没有返回值. 构造器可以重载. 构造器的访问说明符: private:只有本类可以使用这个构造器. protected:这个类的子类和包中的类都可以使用此构造器. pub ...
- javascript对象初探(一)--- 构造器函数
我们可以通过构造器函数(简称构造函数)来创建对象: function Her(){ this.child = 'Jon'; } 为了使用该函数来创建对象,我们需要使用new操作符,例如: var sh ...
- 0021 Java学习笔记-面向对象-包、构造器
封装 面向对象的三大特征: 封装 继承 多态 封装: 将对象的状态信息隐藏,不允许外部程序直接访问 通过该类提供的方法来访问和操作 有啥用: 隐藏类的实现细节 在方法中加入控制逻辑,限制对成员变量的不 ...
随机推荐
- ArcGIS API for JavaScript 4.2学习笔记[8] 2D与3D视图同步
同一份数据不同视图查看可能用的比较少,因为3D视图放大很多后就和2D地图差不多了,畸变很小,用于超大范围的地图显示时有用,很多时候都是在平面地图上进行分析.查询.操作.教学需要可能会对这个有要求? 本 ...
- linux 写U盘出现的问题
在写U盘的时候,报了这样的错,记录如下: umount /dev/sdb // 提示未挂载 mkfs.vfat /dev/sdb // device or resource busy umount / ...
- vue移动端弹框组件,vue-layer-mobile
最近做一个移动端项目,弹框写的比较麻烦,查找资料,找到了这个组件,但是说明文档比较少,自己研究了下,把我碰到的错,和详细用法分享给大家!有疑问可以打开组件看一看,这个组件是仿layer-mobile的 ...
- js基础:对DOM进行操作,删除、添加元素
<body> <div id="div1"> <p id="p1">第一段</p> <p id=" ...
- shell脚本异步日志分析-接口耗时、可用率
背景:现有日志接入日志报表大盘,为了避免作业高峰期间(双十一),系统也要观测系统整体情况,因此提出了观测近五分钟,接口成功率以及耗时等工具(默认统计最近五分钟,并进行结果汇总统计) 使用说明 前提:p ...
- 【转】java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
最近在配置最新的ssh(struts2.3.16.3+hibernate4.3.7+spring4.1.2)的时候遇到的这个错误提示,后来在网上找了半天都不能解决,虽然有个说法是model对象用这样@ ...
- Git详解之七:自定义Git
自定义 Git 到目前为止,我阐述了 Git 基本的运作机制和使用方式,介绍了 Git 提供的许多工具来帮助你简单且有效地使用它. 在本章,我将会介绍 Git 的一些重要的配置方法和钩子机制以满足自定 ...
- Sql 的 RAISERROR用法
http://www.yesky.com/imagesnew/software/tsql/ts_ra-rz_5ooi.htm RAISERROR 返回用户定义的错误信息并设系统标志,记录发生错误.通过 ...
- 使用Python实现的杨辉三角
def triangel(): print ' '*(20*3)+str(1) #定义起始两行 print ' '*(19*3)+str(1)+' '*5+str(1) for i in range( ...
- MariaDB的"response time"插件
"响应时间"是衡量数据库性能的常用指标.在MariaDB中可以使用插件"QUERY_RESPONSE_TIME"来获取查询时间区间的统计信息. // 安装插 件 ...