namespace MyNameSpace
{
    static class MyClass
    {
        static MyClass()
        {
            //Authentication process.. User needs to enter password
        }

        public static void MyMethod()
        {
            //Depends on successful completion of constructor
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass.MyMethod();
        }
    }
}

这是我假设的顺序
  • 静态构造函数
  • 的开始
  • 静态构造函数的结尾
  • 主要
  • 的开始
  • MyMethod的开始
  • 的结尾

    现在,在任何情况下,如果4将在2之前启动,我都会被搞砸。是否可以?

    最佳答案

    您在这里只问了一个问题,但是应该回答十二个左右的问题,所以我会全部回答。


  • 类构造函数的开始(也称为cctor)
  • cctor的结尾
  • 的开始
  • MyMethod的开始



  • 否。正确的顺序是:
  • cctor for Program的开始(如果有)。那没有。
  • 程序的cctor结束(如果有)。那没有。
  • 主要
  • 的开始
  • MyClass的cctor的开始
  • MyClass的cctor结束
  • MyClass.MyMethod的开始



  • 在某些情况下,允许CLR更改静态字段初始化程序运行的顺序。有关详细信息,请参见Jon关于该主题的页面:

    The differences between static constructors and type initializers



    是。如果cctor本身调用MyMethod,则显然在cctor完成之前将调用MyMethod。



    是。如果cctor使用另一种类型,其cctor调用MyMethod,则将在MyClass cctor完成之前调用MyMethod。



    不。



    是。在可以在任何线程上调用static方法之前,cctor将在一个线程上完成。



    保证cctor最多调用一次,无论涉及多少线程。如果两个线程“同时”调用MyMethod,则它们竞争。其中一个输掉比赛并阻塞,直到MyClass cctor在获胜线程中完成。



    真的。



    然后,您有一个经典的锁定顺序反转条件。您的程序陷入僵局。永远。



    如果这样做时很痛,请停止这样做。 永远不要做会阻碍cctor的事情。



    都不是好主意。我的建议是,您应该找到一种不同的方法来确保满足您的方法中涉及安全性的前提条件。

    关于c# - 静态构造函数如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9398509/

    10-11 17:02