为什么不是所有在C#中调用的静态构造函数(即父类的那些)?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么不是所有在C#中调用的静态构造函数(即父类的那些)?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1507字,纯文字阅读大概需要3分钟。
内容图文
![为什么不是所有在C#中调用的静态构造函数(即父类的那些)?](/upload/InfoBanner/zyjiaocheng/826/ef7b73b513bc489badae8734297bb89b.jpg)
我有三个班,Base,Derived和Final. Derived派生自Base,Final派生自Derived.这三个类都有一个静态构造函数.类派生为名为Setup的公共静态方法.当我调用Final.Setup时,我希望所有三个静态构造函数都被执行,但只有Derived中的一个会被运行.
以下是示例源代码:
abstract class Base
{
static Base()
{
System.Console.WriteLine ("Base");
}
}
abstract class Derived : Base
{
static Derived()
{
System.Console.WriteLine ("Derived");
}
public static void Setup()
{
System.Console.WriteLine ("Setup");
}
}
sealed class Final : Derived
{
static Final()
{
System.Console.WriteLine ("Final");
}
}
这对我来说只是部分有意义.我知道调用Final.Setup()实际上只是Derived.Setup()的别名,所以在Final中跳过静态构造函数似乎很公平.但是,为什么不调用Base的静态构造函数?
我可以通过调用Base的无操作静态方法或访问Base的一些虚拟静态方法来解决这个问题.但我想知道:这种看似奇怪的行为背后的原因是什么?
解决方法:
当(根据TCPL)调用静态构造函数时:
>创建类类型的实例.
>引用类类型的任何静态成员.
例如,考虑一个带有静态Main方法的类,其中执行开始:如果你有一个静态构造函数,它将在调用Main方法之前调用.
请注意,即使在执行静态构造函数之前,任何静态字段都会初始化为其默认值,然后会为这些字段执行静态字段初始值设定项.只有这样,才会执行静态构造函数(cctor).
更直接地回答你的问题:静态构造函数不是继承的,也不能直接调用它们,因此你的Base cctor不会在你的场景中被调用,除非你给抽象Base类提供一个静态方法并首先调用它,即如Base.Initialize(),正如您已经建议的那样.
关于推理,这很简单,认为C#(在Java中这是不同的):静态方法不是继承的,因此静态构造函数既不应该被继承,因为这可能会导致不必要的副作用(当没有引用该类时调用一个cctor).
内容总结
以上是互联网集市为您收集整理的为什么不是所有在C#中调用的静态构造函数(即父类的那些)?全部内容,希望文章能够帮你解决为什么不是所有在C#中调用的静态构造函数(即父类的那些)?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。