为什么这些静态构造函数不是在通用继承类型中调用的?

时间:2017-08-14 22:08:43

标签: c#

这是一个不触发某些静态构造函数的程序,尽管它显示了不同的静态实例。

BaseTemplate() Template
Render() from Template
BaseTemplate() Template2
Render() from Template2
False

结果

Factory

这里的目标是为每个子类设置一个Factory的自定义实例,它可以正常工作,但也可以在静态构造函数中初始化它。我们可以看到System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(T).TypeHandle);实例与参考测试不同,但除非使用Static ctor() BaseTemplate() Template Render() from Template Static ctor() 2 BaseTemplate() Template2 Render() from Template2 False

进行特别调用,否则不会调用静态构造函数

然后结果如下。

  cardStyle: {
    backgroundColor: 'white'
  },

1 个答案:

答案 0 :(得分:2)

来自the documentation

  

静态构造函数用于初始化任何静态数据,或执行仅需要执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,会自动调用它

因此,要触发静态控制器,您必须

  1. 创建TemplateTemplate2的实例。你的例子没有。

  2. 致电TemplateTemplate2的静态成员。在您的示例中,两个类都没有任何静态成员(除了ctor),因此您显然不会调用它们。

  3. 如果您修改代码:

    Template.Render();
    Template2.Render();
    var o = new Template();
    var p = new Template2();
    Console.WriteLine(ReferenceEquals(Template.Factory, Template2.Factory));
    

    输出结果为:

    BaseTemplate() Template
    Render() from Template
    BaseTemplate() Template2
    Render() from Template2
    Static ctor()
    Static ctor() 2
    False
    

    使用静态方法没有继承(需要一个VMT,因此需要一个实例)但你可以像这样链接静态构造函数调用:

    public class BaseTemplate<T> where T : new()
    {
        static BaseTemplate()
        {
            Console.WriteLine("BaseTemplate() " + typeof(T).Name);
        }
    
        public static object Factory = new object();
    
        public static void Render()
        {
            Console.WriteLine("Render() from BaseTemplate, " + typeof(T).Name);
        }
    }
    
    public class Template : BaseTemplate<Template>
    {
        static Template()
        {
            Console.WriteLine("Static ctor()");
        }
    
        public static new void Render()
        {
            Console.WriteLine("Render() from Template.");
            BaseTemplate<Template>.Render();
        }
    }
    
    public class Template2 : BaseTemplate<Template2>
    {
        static Template2()
        {
            Console.WriteLine("Static ctor() 2");
        }
    
        public static new void Render()
        {
            Console.WriteLine("Render() from Template2.");
            BaseTemplate<Template2>.Render();
        }
    
    }
    

    具有此输出:

    Static ctor()
    Render() from Template.
    BaseTemplate() Template
    Render() from BaseTemplate, Template
    Static ctor() 2
    Render() from Template2.
    BaseTemplate() Template2
    Render() from BaseTemplate, Template2
    False