zoukankan      html  css  js  c++  java
  • 静态构造函数(Static Constructor)(It performs well in Singleton)

    今天无意间看到了静态构造函数的代码,也许是没怎么见过,觉得新鲜,就顺手写了以下代码,或许我见过,或许我忘记了……呵呵,发布上来自己作个纪念……

    发现用来做Singleton模式倒是不错,呵呵……

    using System;
    
    namespace CA_StaticConstructor
    {
        class StaticClass
        {
            public static StaticClass Instance { get; set; }
            public string Name { get; set; }
            static StaticClass()
            {
                if (Instance == null)
                {
                    Instance = new StaticClass();
                } 
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                StaticClass sc1 = StaticClass.Instance;
                sc1.Name = "sc1 Instance";
                Console.WriteLine(sc1.Name);
    
                StaticClass sc2 = StaticClass.Instance;
                //Without set Name property to Instance
                Console.WriteLine(sc2.Name);
            }
        }
    }
    //Result:
    //sc1 Instance
    //sc1 Instance

    以上代码可以简化为以下形式

    using System;
    
    namespace CA_StaticConstructor
    {
        class StaticClass
        {
            public static StaticClass Instance { get; set; }
            public string Name { get; set; }
            static StaticClass()
            {
                Instance = new StaticClass();
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                StaticClass sc1 = StaticClass.Instance;
                sc1.Name = "sc1 Instance";
                Console.WriteLine(sc1.Name);
    
                StaticClass sc2 = StaticClass.Instance;
                //Without set Name property to Instance
                Console.WriteLine(sc2.Name);
            }
        }
    }
    //Result:
    //sc1 Instance
    //sc1 Instance
    

    注意上文中static StaticClass() 部分的代码,在传统的singleton中总是需要判断如第一段代码的构造,但是由于静态构造器在第一次调用的时候将会invoke,因此在后续的调用中将会保证实例的存在,即使加了也不为过,可以避免如下形式的代码破坏:

            static void Main(string[] args)
            {
                StaticClass sc1 = StaticClass.Instance;
                sc1.Name = "sc1 Instance";
                Console.WriteLine(sc1.Name);
    
                StaticClass.Instance = null;
    
                StaticClass sc2 = StaticClass.Instance;
                //Without set Name property to Instance
                Console.WriteLine(sc2.Name);
            }

    当然按照常规我们最好不要也不应该有set方法,这样我们就可以保证我们的Instance始终是第一次调用的实例了……

    using System;
    
    namespace CA_StaticConstructor
    {
        class StaticClass
        {
            private static readonly StaticClass instance;
            public static StaticClass Instance
            {
                get
                {
                    return instance;
                }
            }
            public string Name { get; set; }
            static StaticClass()
            {
                instance = new StaticClass();
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                StaticClass sc1 = StaticClass.Instance;
                sc1.Name = "sc1 Instance";
                Console.WriteLine(sc1.Name);
    
                //StaticClass.Instance = null;
    
                StaticClass sc2 = StaticClass.Instance;
                //Without set Name property to Instance
                Console.WriteLine(sc2.Name);
            }
        }
    }
    //Result:
    //sc1 Instance
    //sc1 Instance
    
  • 相关阅读:
    性能测试,负载测试,压力测试,容量测试的区别
    全文检索引擎Solr系列——整合MySQL、MongoDB
    全文检索引擎Solr系列——整合中文分词组件IKAnalyzer
    全文检索引擎Solr系列——整合中文分词组件mmseg4j
    全文检索引擎Solr系列——Solr核心概念、配置文件
    全文检索引擎Solr系列—–全文检索基本原理
    ES之一:Elasticsearch6.4 windows安装 head插件ik分词插件安装
    FTP,FTPS,FTPS与防火墙
    NGINX通过Stream转发ftp请求
    nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链步骤(linux系统下)
  • 原文地址:https://www.cnblogs.com/volnet/p/988810.html
Copyright © 2011-2022 走看看