时间:2021-05-20
这里直接给出C#类成员一般初始化顺序:
为什么说是“一般”初始化顺序呢?因为根据类结构的不同,类成员的初始化顺序并不是一成不变的。但是这个顺序是基础,可以推导出其他特殊的初始化顺序。下面我们就来看两种特殊的情况:
static void Main(string[] args){ Console.WriteLine("---------------一般初始化顺序---------------"); var child1 = new Child1(); Console.WriteLine("\n---------------子类静态字段初始化需要使用父类静态字段时初始化顺序---------------"); var child2 = new Child2(); Console.WriteLine("\n---------------子类静态构造函数中使用父类静态字段时初始化顺序---------------"); var child3 = new Child3(); Console.ReadKey();}public class Child1 : Base1{ public static Display ChildStatic = new Display("Child static filed"); private Display _childFiled = new Display("Child filed"); static Child1() => Console.WriteLine("Child static ctor"); public Child1() => Console.WriteLine("Child ctor");}public class Child2 : Base2{ /// <summary> /// 子类静态字段初始化需要使用父类静态字段 /// </summary> public static Display ChildStatic = new Display("Child static filed", () => BaseStatic); private Display _childFiled = new Display("Child filed"); static Child2() => Console.WriteLine("Child static ctor"); public Child2() => Console.WriteLine("Child ctor");}public class Child3 : Base3{ public static Display ChildStatic = new Display("Child static filed"); private Display _childFiled = new Display("Child filed"); /// <summary> /// 子类静态构造函数中使用父类静态字段 /// </summary> static Child3() { Console.WriteLine("Child static ctor"); var baseStatic = BaseStatic; } public Child3() => Console.WriteLine("Child ctor");}/// <summary>/// 3个Base类相同,这里是为了演示静态成员的初始化/// </summary>public class Base1{ public static Display BaseStatic = new Display("Base static filed"); private Display _baseFiled = new Display("Base filed"); static Base1() => Console.WriteLine("Base static ctor"); public Base1() => Console.WriteLine("Base ctor");}public class Base2{ public static Display BaseStatic = new Display("Base static filed"); private Display _baseFiled = new Display("Base filed"); static Base2() => Console.WriteLine("Base static ctor"); public Base2() => Console.WriteLine("Base ctor");}public class Base3{ public static Display BaseStatic = new Display("Base static filed"); private Display _baseFiled = new Display("Base filed"); static Base3() => Console.WriteLine("Base static ctor"); public Base3() => Console.WriteLine("Base ctor");}public class Display{ public Display(string msg, Func<Display> displayFunc = null) { Console.WriteLine(msg); var display = displayFunc?.Invoke(); }}补充一下:
1. 静态构造函数是线程安全的,会在初次访问该类所定义的其他方法、属性或变量之前执行
2. 编译器会在每个构造函数(包括静态和实例)的开头放入适当的程序码,以便把你在定义成员字段时所指定的初始值设置给这些变量,这就是字段总是在构造函数执行前初始化的原因。
3. 无论是静态变量还是实例变量,其取值都应该在声明的时候得以初始化。但以下3种情况不应该编写初始化语句
通过了解类成员的初始化顺序,可以让我们更加详细地了解程序执行的细节,避免写出类似“在构造函数中调用虚函数或抽象函数”的代码。
以上就是c# 类成员初始化顺序的特殊情况的详细内容,更多关于C# 类初始化顺序的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在以下三种情况下需要使用初始化成员列表:一,需要初始化的数据成员是对象的情况;二,需要初始化const修饰的类成员;三,需要初始化引用成员数据;原因:C++可以
C++静态成员的类内初始化详解及实例代码一般来说,关于C++类静态成员的初始化,并不会让人感到难以理解,但是提到C++静态成员的"类内初始化"那就容易迷糊了。我
1.只能在构造函数初始化列表初始化的成员变量的类型?a.const成员变量b.引用类型的成员变量c.static不能在初始化列表中进行初始化d.类成员变
一、类的初始化对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量。类的编译决定了类的初始化过程。编译器生成的class文件主要对定义
与Objective-C不同,Swift的初始化方法需要保证类型的所有属性都被初始化。所以初始化方法的调用顺序就很有讲究。在某个类的子类中,初始化方法里语句的顺