Lazy<T> 重新初始化方法?

21

我们在工作中一直使用自制的类型,从.NET 3.5开始使用,它与Lazy<T>类做着相同的事情,但允许您重新评估Lazy Func的实例。我们想用新的.NET替换我们的类,但是Clear()或IsDirty机制不存在。

有没有一种方法可以重新初始化Lazy<T> Func方法而不必重新实例化类? 如果没有,是否有一种将其实现为扩展方法的方法,还是这只是一种不好的模式?


我猜这是因为它被视为一个值,而另一个值不是同一个值。 - Skurmedel
看起来你想懒惰地重新创建实例?如果是这样,那么这个类(或任何懒初始化类)的意图并不是如此。实例只会被创建一次,但是只有在使用之前(而且仅在使用时)才会被创建。 - Shiv Kumar
这个回答解决了你的问题吗?重置 System.Lazy - StayOnTarget
4个回答

9

因为它无法保证线程安全。那些保证程序员无法修复问题并可能导致错误的类不应该出现在框架中。你可以自己决定是否使用。


8
你想做的不是懒加载,而是其他操作。这就是为什么它不在Lazy<T>类中的原因。

5
如果您真的需要重置您的Lazy<>对象,您需要有一种机制来创建Lazy<>类型的新实例。您可以构建一个包装器,公开与Lazy<>类型相同的属性,再加上Reset方法,该方法只是重新创建它。简单来说,它可能是这样的:
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>();
}

真正的问题是,你是否应该做这样的事情,但如果你确实需要,那可能已经足够满足你的需求了。

5

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接