• 静态构造函数实际运行多少次?


    我们知道,class和struct我们可以定义构造函数。构造函数有实例构造函数和静态构造函数。当每个实例的实例构造,将运行一次。

    无论是静态构造函数,以便它?让我们看一段代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConstructorTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(CData.Num);///A
                Console.WriteLine(CData.Num);///B           
                Console.ReadLine();
            }
        }
    
        public class CData
        {
            public static int Num = 0;
            static CData()
            {
                Num++;
            }
        }
    }
    
    我们推測一下运行的结果:

    A行输出的是1.这个比較easy想到,由于Num初始为0,在构造函数中运行了Num++,所以结果为1.

    那B行输出的呢?会不会又运行了一次Num++,导致输出结果为2?我们来看输出的结果。见下图


    我们看到。输出的结果都是1.

    这是为什么?难道说Num++仅仅运行了一次吗?我们设断点来看看。


    从断点的运行顺序上看。每一次调用CData.Num时,进入到了CData的静态构造函数中,使得Num由0变成了1.而第二次调用CData.Num时,不再进入到CData的静态构造函数中。所以Num依旧是1。

    所以得出结论:静态构造函数仅仅运行一次。

    那有人会问。假设并发呢?

    并发也依旧会运行一次。

    由于在调用静态构造函数时,会先检測有没有被初始化(即有没有被调用过)。假设有,则直接跳过。假设没有,将进入静态构造函数内部。

    在并发时。当有一个位置A在调用静态构造函数时,会检測该静态构造函数没有被初始化。假设没有被初始化,则进行初始化,并进入同步堵塞状态。其它的位置B尽管在并发调用,但会阻寒在这里。当位置A调用完毕后,堵塞状态解除,位置B进入,这时会检測到构造函数已经被初始化了,所以直接跳过。而是否有没有被初始化的标志,是设置在AppDomain(程序域)的层级上的。

    所以静态构造函数很适合用在单件模式中。

    我们能够看一段《CLR via C#》一书中的一段说明:


    结论:静态构造函数在程序域的层级确保了仅仅会运行一次,且是线程安全的。所以很适合于用在单件模式中(或者仅仅须要单一对象的地方)。


    转载请注明出处:http://blog.csdn.net/xxdddail/article/details/38058121


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    利用CMD查看系统硬件信息
    固定资产分类(仅供参考 2005年),
    批量查询数据表的标识值的方法
    安装完office2016 64位后,在安装visio时,报错,无法安装,
    安装office2016 64位时提示64位与32位的office程序不兼容,在系统是64位的情况下,由于应用的需要,必须装64位的office,怎么办
    web.config文件详解
    master..xp_fileexist
    IE11快捷键 双击没反应的解决办法
    Grading
    今年第一个扶贫日
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4750703.html
Copyright © 2020-2023  润新知