2011-02-04 37 views
16

有誰知道爲什麼Microsoft沒有在.NET Framework 4.0中爲Lazy < T>類包含Clear()方法或IsDirty屬性或類似的東西? (更新下面的問題)懶惰<T>重新初始化方法?

我們有一個自從.NET 3.5開始使用的自制類型,我工作的時候和懶惰一樣,但是T> class還允許你讓實例重新評估Lazy Func 。我們想用新的.NET代替我們的類,但是這個Clear()或IsDirty機制不存在。

讓我根據意見重新解釋原始問題。有沒有辦法重新初始化Lazy < T> Func方法而不重新實例化類?如果沒有,是否有辦法將它作爲擴展方法來實現,或者只是一種不好的模式?

+7

「爲什麼沒有」的問題只是咆哮。你能否以更具建設性的方式重述這一點? – 2011-02-04 21:11:07

+0

添加擴展方法... – 2011-02-04 21:14:35

+0

我猜是因爲它被看作是一個值,而另一個值是不同的值。 – Skurmedel 2011-02-04 21:17:49

回答

10

因爲不可能使其線程安全。 保證類的程序員將沒有任何方法解決問題,他們的腿不屬於框架。你可以自由拍攝自己的腿。

1

IsValueCreated不適合你嗎?

6

你想要做的不是懶惰初始化,它是別的。這就是爲什麼它不在Lazy<T>類。

4

因爲這會破壞類型的語義。如果Lazy<T>的狀態隨着時間的推移而變得無效,則需要考慮另一種類型。

2

如果您確實需要重置您的Lazy <>對象,那麼您需要有機制來創建Lazy <>類型的新實例。你可以構建一個包裝器,它公開了與Lazy <>類型相同的屬性以及簡單地重新創建它的Reset-method。簡單來說,它會是這樣的:

public class ResettableLazy<T> 
{ 
    public T Value => this.Container.Value; 
    public bool IsValueCreated => this.Container.IsValueCreated; 
    public void Reset() { this.Container = new Lazy<T>(); } 
    private Lazy<T> Container = new Lazy<T>(); 
} 

真正的問題是你應該做這樣的事情,但如果你真的需要這可能是足夠滿足您的需求。

相關問題