懒惰<t>重新初始化方法?</t>

时间:2011-02-04 21:09:41

标签: .net c#-4.0

有没有人知道为什么微软没有在Lazy&lt; Lazy&lt;中添加Clear()方法或IsDirty属性等等。 T> .NET Framework 4.0中的类? (以下更新的问题)

我们有一个自从.NET 3.5以来一直使用的自制类型,我工作时与Lazy&lt; T> class还允许您让实例重新评估Lazy Func。我们想用新的.NET替换我们的类,但是这个Clear()或IsDirty机制不存在。

让我根据评论重新解释原始问题。有没有办法重新初始化Lazy&lt; T>没有重新实现类的Func方法?如果没有,是否有办法将其作为一种扩展方法来实现,或者只是一个不好的模式?

5 个答案:

答案 0 :(得分:10)

因为不可能使其成为线程安全的。 保证程序员无需任何方法来解决问题的程序员不属于框架。你可以自由地射击自己的腿。

答案 1 :(得分:7)

你想要做的不是延迟初始化,它是另一回事。这就是为什么它不在Lazy<T>类。

答案 2 :(得分:5)

因为这会破坏该类型的语义。如果Lazy<T>的状态随着时间的推移变得无效,则需要考虑其他类型。

答案 3 :(得分:3)

如果您确实需要重置Lazy&lt;&gt;对象你需要有机制来创建Lazy&lt;&gt;的新实例类型。您可以构建一个包含暴露与Lazy&lt;&gt;相同属性的包装器。 type plus 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>();
}

真正的问题是你应该做那样的事情,但如果你真的需要这样做可能足以满足你的需要。

答案 4 :(得分:1)

IsValueCreated不适合你吗?