标题比较抽象,所以我写了一个Demo来说明问题:
공개 클래스 A
{
공개A()
{
Console.WriteLine("당신이 원하는 것을 사용하세요");
}
}
공개 클래스 B : A
{
개인 X x = 새로운 X(); //初始화器
}
공개 클래스 X
{
공개X()
{
Console.WriteLine("X의 사용 방식");
}
}
정적 무효 Main(string[] args)
{
Bb = 새로운 B();
}
앞서 사용하는 전자 제품은 다음과 같습니까?
因为初始化代码会는 构造函数中의 代码会에서 이전에 执行,所以我过去错误的认为:
공개 클래스 B : A
{
개인 X x = 새로운 X(); //初始화器
}
일반적으로:
공개 클래스 B : A
{
개인 X x;
공개 B()
{
x=새로운 X();
}
}
우리는 이 제품이 전자식으로 작동하는 방식으로 상단에서 데모를 실행하는 방식으로 작동하는 것을 확인했습니다.
X의 사용
A의 构造函数被调용
这表明子类的构造器先执行了,让我们看看生成 的构造函数的IL代码 :
공개 클래스 B:A
{
개인 X x;
공개 B()
{
x = 새로운 X();
}
}
生成的构造函数的IL代码是这样的:
.method public hidebysig 특수 이름 rtspecialname
인스턴스 void .ctor() cil이 관리됨
{
// 代码大小 21 (0x15)
.maxstack 8
IL_0000: ldarg.0
IL_0001: 인스턴스 void ConsoleApplication1.Program/A::.ctor() 호출
IL_0006: 아니요
IL_0007: 아니요
IL_0008: ldarg.0
IL_0009: newobj 인스턴스가 void ConsoleApplication1.Program/X::.ctor()
IL_000e: stfld 클래스 ConsoleApplication1.Program/X ConsoleApplication1.Program/B::x
IL_0013: 아니요
IL_0014: 레트
} // 메소드 B::.ctor의 끝
从代码可以看는 是先调用基类的构造函数的!
공개 클래스 B : A
{
개인 X x = 새로운 X();
}
生成的构造函数的IL代码是这样的:
.method public hidebysig 특수 이름 rtspecialname
인스턴스 void .ctor() cil이 관리됨
{
// 代码大小 19 (0x13)
.maxstack 8
IL_0000: ldarg.0
IL_0001: newobj 인스턴스가 void ConsoleApplication1.Program/X::.ctor()
IL_0006: stfld 클래스 ConsoleApplication1.Program/X ConsoleApplication1.Program/B::x
IL_000b: ldarg.0
IL_000c: 인스턴스 void ConsoleApplication1.Program/A::.ctor() 호출
IL_0011: 아니요
IL_0012: 레트
} // 메소드 B::.ctor의 끝
可以看流是先调用初始化器的代码,然后再调用基类构造函数的!要区别是基类构造函数의 사용은 동의하지 않습니다!
C#编译器为什么这样设计,我也没有想到태양광합성원리, 大家有什么看法呢?
请大家多指教啊!
-