【问题标题】:How to call static constructor outside class?如何在类外调用静态构造函数?
【发布时间】:2014-02-05 15:27:55
【问题描述】:

我在面试中被问到:

public class Test
{
    static Test(){}
}

public class Class1 
{
    //Call static constructor Here
}

我尝试在基类构造函数中调用静态构造函数。但这似乎不是正确的方向。你是怎么做到的?

【问题讨论】:

  • 当您访问任何静态属性或方法或创建实例时,会隐式调用静态构造函数。
  • 访问该类的任何其他静态成员或创建该类的一个实例,并且如果没有其他原因导致它发生,则将调用静态构造函数。您永远不需要强迫这种情况发生。

标签: c# .net static


【解决方案1】:

您不能调用静态构造函数,也不能指定其可见性 (public)

来自documentation

自动调用静态构造函数来初始化类 在创建第一个实例或任何静态成员之前 参考。

【讨论】:

    【解决方案2】:

    静态构造函数在使用任何类之前会自动调用,不应手动调用,因此正确的答案是在 Test 类上执行一些操作,例如:

    public class Class1 
    {
        public void CallStaticConstructorHere()
        {
            new Test();
        }
    }
    

    但 99% 的情况下您不应该关心,运行时会在需要时调用它。

    在某些情况下(例如在启动期间强制进行一些初始化,以便以后在应用程序使用期间或在某些单元测试的设置中不会发生)您可能需要强制它。

    RuntimeHelpers 类提供此功能:

    public class Class1 
    {
        public void CallStaticConstructorHere()
        {
            RuntimeHelpers.RunClassConstructor(typeof(Test).TypeHandle);
        }
    }
    

    PS:RunClassConstructor 这个名字会误导它,只有在它没有运行时才会运行它

    PS(2):我不知道确切的问题,但如果面试官说的是基类构造函数 (Class1 : Test),它是无用的,因为没有基类就不会调用派生类中的任何代码之前调用的静态构造函数。

    【讨论】:

    • +1 为 RuntimeHelpers.RunClassConstructor 的 VBFox
    【解决方案3】:

    静态构造函数不会被显式调用,它们在创建第一个实例之前被初始化,因此不能发送参数

    【讨论】:

      【解决方案4】:

      微软声明

      不能直接调用静态构造函数。

      参考here

      【讨论】:

        【解决方案5】:

        这很容易。

        虽然您不能直接调用静态构造函数(众所周知),但您可以通过从.. 静态构造函数访问该类来确定它叫什么...其他静态构造函数访问该类的内容)

        public class Test
        {
            static Test(){}
        }
        
        public class Class1 
        {
            //Call static constructor Here
            static Class1()
            {
                // yes sir!
                var test = new Test();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-08
          • 2018-09-25
          相关资源
          最近更新 更多