C# 派生类的静态初始化

C# 派生类的静态初始化,c#,static-methods,C#,Static Methods,以下程序的输出为 base init BaseMethod derived init DerivedMethod 例如,从派生类调用基类方法会触发基类的init存根,而不是派生类的init存根 class Program { static void Main(string[] args) { Console.WriteLine(Derived.BaseMethod()); Console.WriteLine(Derived.DerivedMeth

以下程序的输出为

base init
BaseMethod
derived init
DerivedMethod
例如,从派生类调用基类方法会触发基类的init存根,而不是派生类的init存根

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Derived.BaseMethod());
        Console.WriteLine(Derived.DerivedMethod());
    }
}

class Base
{
    public static string BaseMethod() { return "BaseMethod"; }
    static bool init = InitClass();
    static bool InitClass()
    {
        Console.WriteLine("base init");
        return true;
    }
}

class Derived : Base
{
    public static string DerivedMethod() { return "DerivedMethod"; }
    static bool init = InitClass();
    static bool InitClass()
    {
        Console.WriteLine("derived init");
        return true;
    }
}
实际上,我的基类没有初始化需求,但我的派生类有初始化需求,我想确保它在任何人以任何方式与该类交互之前运行。不幸的是,与它的大多数交互是通过在基类中定义的方法进行的,如上面的示例所示

我可以修改派生类以隐藏BaseMethod,如下所示:

class Derived : Base
{
    public static new string BaseMethod() { return Base.BaseMethod(); }
    public static string DerivedMethod() { return "DerivedMethod"; }
    static bool init = InitClass();
    static new bool InitClass()
    {
        Console.WriteLine("derived init");
        return true;
    }
}
这会在调用derived.BaseMethod()时产生初始化派生类所需的结果,但这不是很令人满意,因为这是毫无意义的“路由”代码,必须为每个公共静态基方法执行


有什么建议吗?

为什么不使用标准静态构造函数,而不是使用
static new bool InitClass()

  static bool init = false;

  static Derived()
    {
        Console.WriteLine("derived init");
        init = true;
    }

请参见

如果您的所有操作都是静态的,那么您可能不应该首先使用继承,因为正如您所看到的,它实际上并没有给您任何东西。正如您所看到的,静态成员是静态绑定的。这些都是公平点,但并非所有类的方法都是静态的。静态方法主要包括“list”方法(返回所有配置对象的名称)或“load”方法(返回现有配置对象的实例)。这里特别的问题是,我的一个派生类要求存在一个“默认”配置的对象,我希望在访问该类时惰性地检查并实例化它。如果在基类中有静态方法,从那时起,如果您有一个构造函数,那么派生类中的构造函数将运行,您就不会面临这种困境。现在,由于在调用它的方法时可能不会初始化该类,所以我相信最简单的方法是按照您自己的建议执行。但是,如果您有时间,可以查看属性。创建一个采用方法的属性,在属性中运行构造函数,然后运行它收到的方法。另外,正如其他人所指出的,您可以简单地选择包装类而不是派生类。那么,为什么您反对惰性地创建类呢?你说那是你想要的,那正是你得到的。它并不急于计算一个它知道不需要的值。这就是惰性初始化的全部思想。List()是一个基本方法,但我希望派生的.List()初始化默认的派生对象。目前没有发生这种情况,因为派生的.List()只初始化基类。静态构造函数似乎在与上面的init方法相同的条件下运行。特别是,调用派生的.BaseMethod()时,它不会运行:(