看到一管关于单例模式的文章,感觉写的相当不错,链接:http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html其最后一段“饿汉模式”的代码如下:    public sealed class Singleton
    {
        private static readonly Singleton instance = new Singleton();        private Singleton()
        {
        }        public static Singleton GetInstance()
        {
            return instance;
        }
    }
原文中提到:
“readonly关键字可以跟static一起使用,用于指定该常量是类别级的,它的初始化交由静态构造函数实现,并可以在运行时编译。在这种模式下,无需自己解决线程安全性问题,CLR会给我们解决。由此可以看到这个类被加载时,会自动实例化这个类,而不用在第一次调用GetInstance()后才实例化出唯一的单例对象。”现在的问题是如果去掉readonly单例模式还能不能正常使用?如果能正常使用,跟加readonly的模式有何区别?C#readonly单例

解决方案 »

  1.   

    你这个还不算是单例吧,保证一个类仅有一个实例才是单例。
    不加readonly也能正常使用,只要不能让外部直接new就行了,只能通过里面的静态方法去拿到类的实例
    private Singleton instance = null;
            private Singleton()
            { }        public static Singleton Getinstance()
            {
                if (instance == null)
                {
                    instance = new Singleton();            }
                return instance;
            }
      

  2.   

    能不能正常使用自己试一下就知道了,如果不加,可能会在其他地方修改这个变量,这样在多线程情况下就会出现访问冲突;而加了readonly这种情况编译器会提示错误。
      

  3.   

    lz这个也算单例,把readonly去掉不影响使用
    加readonly是防止你在自身类(即Singleton )内部函数里修改它
      

  4.   

    这个是单例模式,有没有readonly无所谓。
    另外二楼说的线程安全问题实际上是不存在的,因为静态构造器由CLR在第一次加载该类型时调用,CLR能够保证这个操作是线程安全的。
      

  5.   

    这个饿汉式的 Singleton 和 线程的安全是无关了,懒汉式就要考虑线程的问题!
      

  6.   

    你好,可不可以提供一些关于CLR能够保证此操作线程安全的更加详细的资料呢,想深入了解一下,感激不尽
      

  7.   

    纠正一下 static readonly 一起出现的时候就是单例的简便实现。
      

  8.   


    CLR via C#详细描述了这个问题,而且相比使用DCL(双重检查锁),贪婪加载(你所谓的饿汉模式)的Singleton更安全。