C# 构造函数调用顺序
2024-08-27 23:08:25
了解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. 执行派生类该实例构造函数的函数体。
执行代码如下:
最新文章
- 初玩Linux部署项目
- Web前端开发基础 第三课(与浏览者交互)
- MSLocalDB
- Armstrong数
- Intellij IDEA 快捷键(Mac)
- 【转】CSS清除浮动_清除float浮动
- ASP.NET页面生存周期
- JMeter 学习笔记从不懂慢慢提升(01)
- PHP中使用kindeditor
- 安装Redis完整过程
- iphone开发教程下载
- Spring Data操作Redis详解
- Hello TensorFlow
- 易企秀H5 json配置文件解密分析
- SAS 输出内容到HTML
- 防盗链之URL参数签名 总结
- 2018-2019-1 1723《程序设计与数据结构》第3&;4周作业 总结
- Java XML SAX 解析注意
- wget 用法
- cf#516B. Equations of Mathematical Magic(二进制,位运算)