我有一个类,DataAdapter
,它被我的站点实例化为单例对象。这个类有我想成为一个懒惰的单身一个人属性,代码来实现:.Net Singleton属性的延迟初始化
private readonly object _personLock = new object();
private volatile IPersonManager _person;
public IPersonManager Person
{
get
{
if (_person == null)
{
lock (_personLock)
{
if (_person == null)
{
_person = new PersonManager(_adUserName, _adPassword, client);
}
}
}
return _person;
}
}
(这三个参数的构造函数的PersonManager的性能/当前对象的字段。) 这代码完美工作(这是一个double-lock check模式)。
但是,这是很多代码,我想利用.Net 4.0中的新Lazy<> type使其更简单。所以我改变了代码:
private static readonly Lazy<IPersonManager> _person = new Lazy<IPersonManager>(() => new PersonManager(_adUserName, _adPassword, client));
public static IPersonManager Person { get { return _person.Value; } }
但是,这并不工作,因为这三个参数是不是静态的(他们是在当前的方法实例对象)。 writeupsI've found没有解决这个问题。我需要一些方法将这些值传递给该lambda表达式?懒惰<>类看起来像期待一个空的签名。
你不正确有关不具有价值,他们的对象的构造函数中赋值的对象。我没有得到一个空引用异常,我得到一个编译错误,因为这些字段找不到。 我不确定你的建议比我开始使用的(工作)双重检查锁解决方案要好。 – Arbiter 2012-02-15 18:17:21
@Arbiter从初始化它们的代码中不清楚。 KeithS建议应该为你工作。我的第二个建议是不混合模式。 – sarvesh 2012-02-15 19:12:40