我相信 C# 的对象初始化顺序是这样的:
- 派生静态字段
- 派生静态构造函数
- 派生实例字段
- 基本静态字段
- 基础静态构造函数
- 基本实例字段
- 基实例构造函数
- 派生实例构造函数
下面你会看到一个简单的测试程序以及我运行它时产生的输出。
public class UiBase
{
protected static string Something = "Hello";
public UiBase()
{
Console.WriteLine(this.ToString());
}
}
public class Point : UiBase
{
private int X = -1;
private int Y = -1;
static Point()
{
Something = "Bar";
}
public Point(int x, int y)
{
X = x;
Y = y;
}
public override string ToString()
{
return $"Point:{X}/{Y}/{Something}";
}
}
public static class Program{
public static void Main(){
var x = new Point(2,1);
Console.WriteLine(x);
}
on Console:
Point:-1/-1/Bar
Point:2/1/Bar
当我根据上面的列表考虑它应该如何发生时,我相信它应该是这样的:
- 点静态字段(在我的情况下没有?)
- 点静态构造函数 -> 将Something设置为“Bar”
- 点实例字段
- 基本静态字段 -> 将某事设置回“你好”?...
然而,它并没有将Something设置回Hello,这真的让我感到困惑。那么我该如何解释呢?还是对象初始化与我所说的不同?