【发布时间】:2020-05-02 05:43:47
【问题描述】:
我相信 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
当我根据上面的列表思考它应该如何发生时,我认为应该是这样的:
- 点静态字段(在我的情况下没有?)
- Point 静态构造函数 -> 将 Something 设置为“Bar”
- 点实例字段
- 基本静态字段 -> 将Something 设置回“Hello”? ...
但是它并没有将Something设置回Hello,这真的让我感到困惑。那么我该如何解释呢?还是对象初始化与我所说的不同?
【问题讨论】:
-
你在这一行输出了什么?
Console.WriteLine(它不会编译 -
抱歉复制意大利面错误。我纠正了它
-
不,在创建任何对象实例之前,静态构造函数都必须先出现。
-
静态的、基础的、派生的。在未密封的类的构造函数中调用虚方法是有风险的。 C++ 语言值得注意,它防止方法在构造函数完成运行之前表现为虚拟。为了防止出现这样的意外,尽管程序员现在在您想要惊喜时往往会感到难过。 C# 不这样做。
标签: c# .net initialization