6 CLR实例构造器
引用类型构造器
如果我们没有定义实例构造器,那么编译器会为我们默认产生一个无参构造器。
实例对象初始化过程
- 为实例分配内存;
- 初始化附加成员,包括方法表指针和SyncBlockIndex变量(我们已经在


调用顺序
如果类没有显示定义构造器,编译器会自动生成一个无参构造器,调用基类的无参构造器。例如
public class Animal{}
相当于
public class Animal
{
public Animal():base(){}
}
如果类的修饰符为static(sealed和abstract),编译器不会默认生成构造器;
如果基类没有提供无参构造器,那么派生类必须显示调用一个构造器,否则编译错误。
如果存在继承关系,派生类在使用基类的字段之前应该先调用基类的构造器。如果派生类没有显式调用基类构造器,则编译器会自动产生调用基类无参构造器的代码,沿着继承层次一直到System.Object的无参构造器位置。例如下面,调用Dog dog=new Dog()方法的结果。

class Dog:Animal。。。

Dog()方法IL代码

代码爆炸?
为了防止构造器重载时大量重复赋值造成代码膨胀,我们建议将公共的初始化语句放在一个构造函数中,然后其他的构造器显式调用该构造器。
class A
{
public int xxxx = ;
public int xxxx2 = ;
public int xxxx3 = ; public A()
{
Console.WriteLine("我是类A的无参构造器");
} public A(string ss)
{
Console.WriteLine("我是类A的无参构造器");
}
} //编译后等价于
class A
{
public int xxxx;
public int xxxx2;
public int xxxx3; public A()
{
xxxx = ;
xxxx2 = ;
xxxx3 = ;
Console.WriteLine("我是类A的无参构造器");
} public A(string ss)
{
xxxx = ;
xxxx2 = ;
xxxx3 = ;
Console.WriteLine("我是类A的无参构造器");
}
} /// <summary>
/// ////////////////////////////////////////////////////////////////////////////////////////////////
/// </summary>
class A
{
public int xxxx = ;
public int xxxx2 = ;
public int xxxx3 = ; public A()
{
Console.WriteLine("我是类A的无参构造器");
} //防止代码爆炸
public A(string ss):this()
{
Console.WriteLine("我是类A的无参构造器");
}
} //编译后等价于
class A
{
public int xxxx;
public int xxxx2;
public int xxxx3; public A()
{
xxxx = ;
xxxx2 = ;
xxxx3 = ;
Console.WriteLine("我是类A的无参构造器");
} public A(string ss):this()
{
Console.WriteLine("我是类A的无参构造器");
}
}
值类型构造器
- 值类型没有默认产生的无参构造器,也不允许我们定义无参构造器。但是我们可以自定义带参数的构造器。

- 不允许在值类型中内联实例字段的初始化。下面的例子会产生编译错误。
struct TestStruct
{
partial int number=5;
}
- 值类型带参构造函数必须对所有实例字段进行初始化才可以。如果有变量没有初始化,就会报错。

如果不想对所有字段一一初始化,有一种替代方案:

{
public int age;
public string name;
public Dog(string Name)
{
this = new Dog();
name = Name;
}
}

在值类型构造器中,this代表值类型本身的一个实例,用New创建的值类型实例赋给this时,会将所有字段置零。所以这个方案可以编译通过。
- 带参构造函数定义之后需要用new显式调用才能执行。否则值类型的字段会保持0或Null值。

6 CLR实例构造器的更多相关文章
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_8.1实例构造器和类A
public class SomeType { } //等价于 public class SomeType { public SomeType():base(){} } [解释]如果定义的类没有显示定 ...
- 6 CLR静态构造器
CLR保证一个类型构造器在每个AppDomain中只执行一次,而且这种执行是线程安全的. 作用: 就是初始化静态成员 比如有几个静态成员需要初始化那你把初始化代码放到哪呢? 放到普通构造函数里,那肯定 ...
- Sql Server 2005 CLR实例
本文转载:http://www.cnblogs.com/yongfa365/archive/2010/04/26/SQL-Server-CLR.html CSDN:博客参考http://blog.cs ...
- CLR via C#(06)- 构造器
最近忙着看新还珠,好几天不学习了.玩物丧志啊,罪过罪过. 今天总结的是类构造器的知识,其实这方面的文章蛮多的,可还是觉得亲自写一下对自己的思考和认识会有提高. 对于构造器,大家应该都不陌生,它主要是用 ...
- CLR类型设计之方法与构造器
无论学习那门语言都要学习函数体,C#,JAVA,PHP,都会涉及到函数体,而C#的函数体成员并不少,方法和构造器就是函数体成员之一,函数体成员还包括但不限于:方法,属性,构造器,终结器,运算符及索引器 ...
- 类型基础---CLR Via C#笔记一
一.所有类型都是从System.Obejct派生 1.下面两个类型定义是完全一致的: class Employee{ ... } class Employee:System.Object{ ... } ...
- 《CLR.via.C#第三版》第二部分第8,9章节读书笔记(四)
三种类型的构造方法: 实例构造器(引用类型):实例构造器永远不能被继承(所以方法前没有修饰符):如果类的修饰符为static(sealed和abstract),编译器根本不会在类的定义中生成一个默认构 ...
- CLR via C# 读书笔记---常量、字段、方法和参数
常量 常量是值从不变化的符号.定义常量符号时,它的值必须能在编译时确定.确定后,编译器将唱两只保存在程序集元数据中.使用const关键字声明常量.由于常量值从不变化,所以常量总是被视为类型定义的一部分 ...
- C#知识点总结系列:5、CLR的组成和运转
clr基本 CLR(Common Language Runtime)是一个可由多种编程语言使用的“运行时”.(例如:c#,c++/cli,vb,f#,ironpython,ironruby,il... ...
随机推荐
- App架构师实践指南四之性能优化一
App架构师实践指南四之性能优化一 1.性能维度常见用来衡量App性能的维度如图9-1所示.其中,性能指标包括电池(电量/温度).流量(上行流量/下行流量等).CPU(平均/最大/最小).内存 ...
- jquery操作radio,checkbox
1. 获取radio选中的value. $('input:radio[name=sex]:checked').val(); 2. 选择 radio 按钮 (Male). $('input:radio[ ...
- Java:大文件拆分工具
java大文件拆分工具(过滤掉表头) import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File ...
- Android性能优化-App启动优化
原文地址:https://developer.android.com/topic/performance/launch-time.html#common 通常用户期望app响应和加载速度越快越好.一个 ...
- 微软BI SSIS 2012 辅助阅读博客
大家可以根据对应的视频课程名称查找相关的辅助阅读博客,有少量辅助阅读博客和视频课程讲解内容相同,大部分都是拓展总结部分.希望大家在学完每一个视频课程之后看看相关博客内容,这样可以在知识面和深度上继续得 ...
- SVN的Branch和Tag管理
dev:开发主线 branch: 部分特殊客户的定制化版本 tag: 主线的某个发布版本 release: 主线的里程碑式的发布版本(相比上一里程碑版本,改动非常大,并且当前已经很稳定的) 你可以在b ...
- sql语句语法
13.1. 数据定义语句 . ALTER DATABASE语法 . ALTER TABLE语法 . CREATE DATABASE语法 . CREATE INDEX语法 . CREATE TABLE语 ...
- 设计模式C++实现——工厂模式
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...
- Photodesk for Mac(Instagram 桌面客户端)破解版安装
1.软件简介 PhotoDesk - for Instagram 是 macOS 系统上一款 Instagram 客户端,可以让大家在 Mac 上观看朋友的新照片.或是最近热门的作品,也可以 f ...
- linux备份数据mysql
到mysql安装目录下的bin: ./mysqldump -u root -p ebuy_mgt > /home/2017backup.sql