我有一個類,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