假设我有2个班级:
public abstract class Foo
{
static Foo()
{
print("4");
}
}
public class Bar : Foo
{
static Bar()
{
print("2");
}
static void DoSomething()
{
/*...*/
}
}
我希望在调用Bar.DoSomething()
之后(假设这是我第一次访问Bar类),事件的顺序将是:
4
2
DoSomething
在底线,我希望打印42
测试后,似乎只打印2
And that is not even an answer
你能解释一下这种行为吗?
答案 0 :(得分:8)
规范声明:
类的静态构造函数在给定的应用程序域中最多执行一次。静态构造函数的执行由应用程序域中发生的以下第一个事件触发:
- 创建了一个类的实例。
- 引用该类的任何静态成员。
醇>
因为您没有引用基类的任何成员,所以构造函数不会被驱逐。
试试这个:
public abstract class Foo
{
static Foo()
{
Console.Write("4");
}
protected internal static void Baz()
{
// I don't do anything but am called in inherited classes'
// constructors to call the Foo constructor
}
}
public class Bar : Foo
{
static Bar()
{
Foo.Baz();
Console.Write("2");
}
public static void DoSomething()
{
/*...*/
}
}
了解更多信息:
答案 1 :(得分:6)
未调用基类静态构造函数的原因是因为,我们还没有访问基类的任何静态成员,也没有提到派生类的实例。
根据文档,这些是调用静态构造函数的时间。
在创建第一个实例之前自动调用它 静态成员被引用。
在下面的代码中,当我们调用DoSomething
时,将调用基类构造函数
public abstract class Foo
{
static Foo()
{
Console.Write("4");
j = 5;
}
protected static int j;
public static void DoNothing()
{
}
}
public class Bar : Foo
{
static Bar()
{
Console.Write("2");
}
public static void DoSomething()
{
Console.Write(j);
}
}