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

Rob*_*ood 19 .net c#-4.0

有谁知道为什么Microsoft没有在.NET Framework 4.0中的Lazy <T>类中包含Clear()方法或IsDirty属性或类似内容?(以下更新的问题)

我们使用自.NET 3.5以来一直使用的自制类型,其中我使用与Lazy <T>类相同的东西,但允许您让实例重新评估Lazy Func.我们想用新的.NET替换我们的类,但是这个Clear()或IsDirty机制不存在.

让我根据评论重新解释原始问题.有没有办法重新初始化Lazy <T> Func方法而不重新实现该类?如果没有,是否有办法将其作为扩展方法实现,或者只是一个不好的模式首先要遵循?

Han*_*ant 9

因为不可能使它成为线程安全的.那类保证程序员将拍摄他的腿没有任何办法来解决这个问题没有一个框架的归属.你可以自由地射击自己的腿.

  • 线程安全是Lazy类的一个选项 - 甚至可能不是默认类.因此,这个答案并不适用. (3认同)
  • 为什么*不可能*使其线程安全?这不只是一个锁定块内的更新和两个属性的一些额外锁定(`IsValueCreated`和`Value`)?我不是多线程专家,但初看起来似乎是可行的...... (3认同)

Dav*_*Yaw 7

你想做的不是延迟初始化,它是另一回事.这就是为什么它不在Lazy<T>课堂上.


Cha*_*ion 5

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


小智 5

如果您确实需要重置 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>();
}
Run Code Online (Sandbox Code Playgroud)

真正的问题是您是否应该这样做,但如果您确实需要这样做,那可能足以满足您的需求。