我有一个使用单例模式的简单类:
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.Rand
和instance2.Rand
有不同的值。
为什么我的单身人士有两个不同的实例以及如何解决这个问题?
答案 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)
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,所以如果你不能使用它。