这是一个不触发某些静态构造函数的程序,尽管它显示了不同的静态实例。
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'
},
答案 0 :(得分:2)
静态构造函数用于初始化任何静态数据,或执行仅需要执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,会自动调用它 。
因此,要触发静态控制器,您必须
创建Template
或Template2
的实例。你的例子没有。
致电Template
或Template2
的静态成员。在您的示例中,两个类都没有任何静态成员(除了ctor),因此您显然不会调用它们。
如果您修改代码:
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