ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

为什么不是所有在C#中调用的静态构造函数(即父类的那些)?

2019-05-18 11:56:06  阅读:161  来源: 互联网

标签:c static-constructor


我有三个班,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,static-constructor
来源: https://codeday.me/bug/20190518/1127791.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有