单身人士模式 - 不同的财产价值

时间:2017-02-19 19:32:11

标签: c# singleton

我有一个使用单例模式的简单类:

public class MyClass
{
    private MyClass()
    { }

    private static MyClass instance;
    private static readonly object locked = new object();

    //Singleton
    public static MyClass Instance
    {
        get
        {
            lock (locked)
            {
                if (instance == null)
                {
                    instance = new MyClass();
                }
            }

            return instance;
        }
    }

    public string Rand
    {
        get
        {
            return new Random().Next(2500).ToString();
        }
    }
}

但如果我这样做:

var instance1 = MyClass.Instance;
var instance2 = MyClass.Instance;

instance1.Randinstance2.Rand有不同的值。

为什么我的单身人士有两个不同的实例以及如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

每次尝试访问Rand时,都会调用get方法,导致它创建一个新的Random Instance

而是试试这个:

private string _rand = return new Random().Next(2500).ToString();

public string Rand {
 get {
     return _rand;
 }
}

答案 1 :(得分:1)

每次从Rand读取时,您都在计算随机值。

答案 2 :(得分:1)

单个实例和访问Rand属性的Singleton实例之间存在差异,如果每次创建私有字段或在
  private string _rand; 

  public static MyClass Instance
    {
        get
        {
            lock (locked)
            {
                if (instance == null)
                {
                    instance = new MyClass();
                    _rand = return new Random().Next(2500).ToString();

                }
            }

            return instance;
        }
    }

public string Rand {
 get {
     return _rand;
 }
}

答案 3 :(得分:1)

只需在混合中添加一些c#6并使用.NET 4的Lazy

public class MyClass
        {
            private static Lazy<MyClass> instance = new Lazy<MyClass>(() => new MyClass());

            public static MyClass Instance => instance.Value;

            public string Rand { get; } = (new Random()).Next(2500).ToString();

            private MyClass() { }
        }

编辑 对于之间的区别 public string Rand { get { return (new Random()).Next(2500).ToString(); } }public string Rand { get; } = (new Random()).Next(2500).ToString(); 第一个代码执行属性体中的代码(get {everything in hear}),而第二个代码在字段初始化期间执行(在构造函数之前运行的特殊步骤)。这称为自动属性初始化程序。你扭动这个

是一样的
public readonly string rand = (new Random()).Next(2500).ToString();

            public string Rand
            {
                get
                {
                    return rand;
                }
            }

有关详细信息,请查看https://blogs.msdn.microsoft.com/csharpfaq/2014/11/20/new-features-in-c-6/

注意:Singleton被认为是Antipattern,所以如果你不能使用它。