zoukankan      html  css  js  c++  java
  • C# 静态类 单例模式 对比

    公司的类都需要使用单例模式实现,这个可以节省资源,避免重复对象的生成。但是静态类也可以做到这一点,而且写起来更简洁,于是查阅相关资料,希望弄明白两者的差别。

    1.单例模式可以在用到的时候初始化,而静态类会在程序开始运行时初始化?

    通过自己的实践,我认为这个说法是不对的。我写了下面的例子进行实验。

        class Program
        {
            static void Main(string[] args)
            {
    
                Console.WriteLine(Class1.get(190));
                GC.Collect();
                Console.ReadKey();
            }
        }
        public static class Class1
        {
            public static int[] arr = new int[20480000];
    
            static Class1()
            {
                for (int i = 1; i < arr.Length; i++)
                {
                    arr[i] = i;
                }
            }
    
            public static int get(int i)
            {
                return arr[i];
            }
        }

    程序进入主函数时,内存是这样的

    显然静态类中的arr没有被初始化,继续执行

      

    可以看到这时静态类的arr被初始化了,而且arr值全部为0时,内存并没有变化,难道是微软做了优化?

    2.GOF对单件的第一句场景解释就是“如果需要唯一实例”?

    额,静态类难道不是唯一实例么?

    3.单例模式,解耦?

    public interface IHelloWorld
    {
        string HelloWorld();
    }
     
    //然后是接口的两个实现.
    public class HelloWorldEnglish : IHelloWorld
    {
        string IHelloWorld.HelloWorld()
        {
            return "Hello World !";
        }
    }
    public class HelloWorldChinese : IHelloWorld
    {
        string IHelloWorld.HelloWorld()
        {
            return "您好 世界 !";
        }
    }
    
    public class People
    {
        private readonly IHelloWorld  peopleHelloWorld;
        public People(IHelloWorld helloWorld)
        {
            this.peopleHelloWorld = CreateSingle()
    //这里你可以使用单例模式创建出来HelloWorldEnglish 或 HelloWorldChinese
        }
        public void SayHello()
        {
            Console.WriteLine(this.peopleHelloWorld.HelloWorld());
        }
    }

    这个代码我看完了愣是没明白解耦和单例啥关系,倒是明白了接口解耦挺好的(手动笑哭),下面大侠观点与我相同,但还是没有解开我的疑团

     4.单例可以有继承,实现接口,而静态类不能

    这个观点我比较赞同,如果想使用单例,又想松耦合,就用单例模式吧。

    静态类比较适合工具类。


    参考链接:

    https://bbs.csdn.net/topics/390487790

    https://www.cnblogs.com/zhangzt/p/4350556.html

    https://bbs.csdn.net/topics/390825682

    https://www.xin3721.com/ArticlecSharp/c13696.html

  • 相关阅读:
    centos mongo数据库搭建
    闪屏页白屏或者显示旧图
    在Sqlserver下巧用行列转换日期的数据统计
    读 《.Net 之美》解析.Net Remoting (应用程序域)-- Part.1
    MVC的自定义动作过滤器(一)
    【算法】快排
    【编程范式】C语言1
    排序
    日志记录类
    邮箱发送类
  • 原文地址:https://www.cnblogs.com/wintertone/p/11515285.html
Copyright © 2011-2022 走看看