Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态构造函数是如何工作的?_C#_C# 4.0_Static Constructor - Fatal编程技术网

C# 静态构造函数是如何工作的?

C# 静态构造函数是如何工作的?,c#,c#-4.0,static-constructor,C#,C# 4.0,Static Constructor,这是我假设的顺序 静态构造函数的开始 静态构造函数结束 主管道的启动 MyMethod的开始 干管末端 现在在任何情况下,如果4在2之前开始,我就完蛋了。有可能吗?3实际上是1:静态初始化直到第一次使用它所属的类时才开始 如果从静态构造函数或静态初始化块调用MyMethod,则可能出现这种情况。如果您没有直接或间接地从静态构造函数调用MyMethod,您应该不会有问题。根据,静态构造函数: 将自动调用静态构造函数来初始化该类 在创建第一个实例或创建任何静态成员之前 参考 因此,静态构造函数将在调

这是我假设的顺序

  • 静态构造函数的开始
  • 静态构造函数结束
  • 主管道的启动
  • MyMethod的开始
  • 干管末端
  • 现在在任何情况下,如果4在2之前开始,我就完蛋了。有可能吗?

    3实际上是1:静态初始化直到第一次使用它所属的类时才开始

    如果从静态构造函数或静态初始化块调用
    MyMethod
    ,则可能出现这种情况。如果您没有直接或间接地从静态构造函数调用
    MyMethod
    ,您应该不会有问题。

    根据,静态构造函数:

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

    因此,静态构造函数将在调用静态方法
    MyClass.MyMethod()
    之前被调用(当然,假设在静态构造或静态字段初始化期间也没有被调用)

    现在,如果您在该
    静态构造函数中执行任何异步操作,那么您的工作就是同步该构造函数。

    来自(我的重点):

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


    您可以保证4总是在2之后出现(如果您没有从静态方法创建类的实例),但是1和3的情况并非如此。

    在执行mymethod之前将调用静态构造函数。然而,如果你是螺丝钉,如果4是在2之前调用,那么我建议你重新考虑你的设计。无论如何都不应该在静态构造函数中执行复杂的操作。

    CLR保证静态构造函数在访问任何静态成员之前运行。然而,你的设计有点臭。这样做更简单:

    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运行的唯一方法是抛出异常。

    确保在执行静态类的任何方法之前调用了该类的构造函数。例如:

    static void Main(string[] args) 
    { 
         bool userIsAuthenticated = MyClass.AuthenticateUser();
         if (userIsAuthenticated)
             MyClass.MyMethod(); 
     } 
    
    输出:

    按回车键

    //按回车键后

    你好,我是

    你好

    你好


    你在这里只问了一个问题,但是有十几个问题你应该问,所以我会全部回答

    这是我假设的顺序

  • 类构造函数的开始(也称为
    cctor
  • cctor末端
  • 主管道的启动
  • MyMethod的开始
  • 这是正确的吗

    否。正确的顺序是:

  • 启动程序的cctor(如果有)。没有
  • 程序的cctor结束(如果有)。没有
  • 主管道的启动
  • MyClass的cctor开始
  • MyClass的cctor结束
  • MyClass.MyMethod的开始
  • 如果存在静态字段初始值设定项怎么办

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

    MyMethod
    这样的静态方法是否可能在该类的cctor完成之前被调用

    对。如果cctor本身调用MyMethod,那么显然在cctor完成之前会调用MyMethod

    cctor不调用MyMethod。在MyClass的cctor完成之前,是否可能调用像
    MyMethod
    这样的静态方法

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

    没有人直接或间接地调用MyMethod!现在有没有可能在MyClass的cctor完成之前调用像
    MyMethod
    这样的静态方法

    没有

    即使涉及多个线程,这仍然是真的吗

    对。在任何线程上调用静态方法之前,cctor将在一个线程上完成

    cctor可以被多次调用吗?假设两个线程都导致cctor运行

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

    丢失的线程会阻塞,直到完成cctor?真的吗

    真的

    那么,如果获胜线程上的cctor调用了阻止先前由失败线程使用的锁的代码呢

    然后你有一个经典的锁顺序反转条件。你的程序死锁了。永远

    这似乎很危险。我怎样才能避免僵局

    如果你那样做很痛,那就停止做千万不要做会阻碍cctor的事情。

    依靠cctor初始化语义来实施复杂的安全需求是一个好主意吗?有一个进行用户交互的cctor是个好主意吗


    两者都不是好主意。我的建议是,您应该找到一种不同的方法来确保满足方法中影响安全性的先决条件

    或者您可以在调试器中单步执行。

    以下是实际运行顺序:

  • 开始
    Main
  • 静态
    MyClass
    构造函数的开始
  • 静态
    MyClass
    构造函数的结尾
  • 开始
    MyMethod
  • Main的结尾

  • 这是一个java还是c的问题?您已经放置了两个标记,我认为这两种语言的规范并不相同。在我的openion中,这两种语言的工作都是一样的。。但我是C#guy。。Sry for thatJava没有同样的静态构造函数,只有用于静态初始化的静态块
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Press enter");
            Console.ReadLine();
            Boop.SayHi();
            Boop.SayHi();
            Console.ReadLine();
        }
    
    }
    
    static class Boop
    {
        static Boop()
        {
            Console.WriteLine("Hi incoming ...");
        }
    
        public static void SayHi()
        {
            Console.WriteLine("Hi there!");
        }
    }