继承的静态成员的静态初始化考虑下面的示例代码:放;}}publicclassB:A{staticB(){TheT="Test";}}publicclassProgram{publicstaticvoidMain(String[]args){Console.WriteLine(B.TheT);这里B.TheT是空的。但是,如下更改Main方法:publicstaticvoidMain(){newB();Console.WriteLine(B.TheT);正如预期的那样,B.TheT是“测试”。我可以理解这会强制静态构造函数运行,但为什么在第一种情况下不会发生这种情况?我尝试阅读规范,这引起了我的注意(§10.12):[...]静态构造函数的执行由应用程序域中发生的以下事件中的第一个触发:?[...]?对任何静态成员的引用一个类类型。我对此的解释是,由于TheT不是B的成员,因此不会强制运行B的静态构造函数。这是对的吗?如果这是正确的,我怎样才能最好地让B指定如何初始化TheT?A.TheT是预期的“TEST”。我可以理解这会强制静态构造函数运行,但为什么在第一种情况下不会发生这种情况?基本上,您实际上并没有引用B。如果您查看IL,我认为您会发现您的代码实际上等同于:publicstaticvoidMain(String[]args){Console.WriteLine(A.TheT);}即使你写了B.TheT,编译器也确信这就是你的意思。如果这是正确的,我怎样才能最好地让A指定TheT的初始化方式?老实说,我会尽量避免这样做……但是你总是可以向B添加一个静态方法:publicstaticvoidInitialize(){//Typeinitializerwillbeexecutednow.静态构造函数在第一次访问之前被调用,或者最迟在第一次访问时被调用。也就是说,您知道它是在首次访问时调用的,而不是调用了多久之前。但是,如果未访问,则不会调用它。因此,只有在调用时才有可能进行控制。根据MSDN参考,静态构造函数用于初始化任何静态数据,或执行只需要执行一次的特定操作。在创建第一个实例或引用任何静态成员之前自动调用它。在第二种情况下,称为静态构造函数,它将调用实际类型的静态构造函数,而不是派生函数的静态构造函数。因此,在您的情况下,它调用A=>A的静态构造函数,而不是A要证明此行为,请执行以下操作:publicclassBase{staticBase(){"Basestatic".Dump();}}publicclassDerived:Base{staticDerived(){“Derivedstatic”.Dump();}publicstaticstringtemp="Hello";}并调用Derived.temp.Dump();你会得到:Derivedstatic你好,这是你在代码中实际做的,你访问类型A并调用它的默认静态ctor。以上就是C#学习教程:静态初始化继承之静态成员分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
