了解C#的一个类的加载过程,对于语言机制的理解和写出高效的语言很有帮助,这里简单介绍一下类的实例的构造函数调用过程。
C#类的实例的构造过程是,先为实例的数据字段分配内存,并对所有字段按字节置零(0或者null);然后初始化附加内存(类型对象指针和同步块索引);调用类型的实例构造器(也就是new关键字调用的普通构造函数)初始化字段。
假如有两个类:基类BaseClass和派生类DerivedClass。DerivedClass继承BaseClass。

 namespace GenericSyntax.Constructor
{
class BaseClass
{
public BaseClass()
{
Console.WriteLine("Base class Ctor.");
}
} class DerivedClass:BaseClass
{
private string m_Var1 = "Assigned in declaration.";
private string m_Var2;
public DerivedClass()
{
Console.WriteLine(m_Var2==null);
Console.WriteLine(m_Var1);
m_Var1 = "Assigned in constructor of derived Class.";
Console.WriteLine("Derived class Ctor.");
}
public override string ToString()
{
return m_Var1;
}
}
}
namespace GenericSyntax
{
class Program
{
static void Main(string[] args)
{
TestCtor();
Console.ReadKey();
}
private static void TestCtor()
{
Constructor.DerivedClass instance = new
Constructor.DerivedClass();
Console.WriteLine(instance.ToString());
}
}
}

生成的BaseClass的IL和DerivedClass的IL如下:

 .method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// 代码大小 20 (0x14)
.maxstack
IL_0000: ldarg.
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: nop
IL_0007: nop
IL_0008: ldstr "Base class Ctor."
IL_000d: call void [mscorlib]System.Console::WriteLine(string)
IL_0012: nop
IL_0013: ret
} // end of method BaseClass::.ctor
 .method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// 代码大小 69 (0x45)
.maxstack
IL_0000: ldarg.
IL_0001: ldstr "Assigned in declaration."
IL_0006: stfld string GenericSyntax.Constructor.DerivedClass::m_Var1
IL_000b: ldarg.
IL_000c: call instance void GenericSyntax.Constructor.BaseClass::.ctor()
IL_0011: nop
IL_0012: nop
IL_0013: ldarg.
IL_0014: ldfld string GenericSyntax.Constructor.DerivedClass::m_Var2
IL_0019: ldnull
IL_001a: ceq
IL_001c: call void [mscorlib]System.Console::WriteLine(bool)
IL_0021: nop
IL_0022: ldarg.
IL_0023: ldfld string GenericSyntax.Constructor.DerivedClass::m_Var1
IL_0028: call void [mscorlib]System.Console::WriteLine(string)
IL_002d: nop
IL_002e: ldarg.
IL_002f: ldstr "Assigned in constructor of derived Class."
IL_0034: stfld string GenericSyntax.Constructor.DerivedClass::m_Var1
IL_0039: ldstr "Derived class Ctor."
IL_003e: call void [mscorlib]System.Console::WriteLine(string)
IL_0043: nop
IL_0044: ret
} // end of method DerivedClass::.ctor

可以看出,则初始化DerivedClass时,DerivedClass的构造函数的IL代码顺序执行如下
1. 解析派生类实例字段的直接赋值语句,即:如果字段有直接赋值语句,则用该赋值语句或者字面量对字段进行赋值。
2. 调用基类的构造函数(逐级向上调用,知道Object的构造函数),基类的实例化过程同理。
3. 执行派生类该实例构造函数的函数体。

执行代码如下:

最新文章

  1. 初玩Linux部署项目
  2. Web前端开发基础 第三课(与浏览者交互)
  3. MSLocalDB
  4. Armstrong数
  5. Intellij IDEA 快捷键(Mac)
  6. 【转】CSS清除浮动_清除float浮动
  7. ASP.NET页面生存周期
  8. JMeter 学习笔记从不懂慢慢提升(01)
  9. PHP中使用kindeditor
  10. 安装Redis完整过程
  11. iphone开发教程下载
  12. Spring Data操作Redis详解
  13. Hello TensorFlow
  14. 易企秀H5 json配置文件解密分析
  15. SAS 输出内容到HTML
  16. 防盗链之URL参数签名 总结
  17. 2018-2019-1 1723《程序设计与数据结构》第3&4周作业 总结
  18. Java XML SAX 解析注意
  19. wget 用法
  20. cf#516B. Equations of Mathematical Magic(二进制,位运算)

热门文章

  1. centos7 Dockerfile安装nginx
  2. Date、Calendar、Timestamp的区别与转换
  3. django 多数据库时 ORM语句 选择数据库
  4. CNI插件实现框架---以loopback为示例
  5. python collection 和 heapq 模块使用说明
  6. 解决python中write()函数向文件中写中文时出现乱码的问题
  7. 初级dba学习之路参考
  8. golang的多协程实践
  9. linux一路填坑...
  10. python 多进程使用Queue通信的例子