【问题标题】:Lazy<T> reinitialization method?Lazy<T> 重新初始化方法?
【发布时间】:2011-02-04 21:09:40
【问题描述】:

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

我们有一个自 .NET 3.5 以来一直在使用的自制类型,它与 Lazy 类执行相同的操作,但允许您让实例重新评估 Lazy Func。我们想用新的 .NET 类替换我们的类,但这种 Clear() 或 IsDirty 机制不存在。

让我根据 cmets 重新表述最初的问题。有没有办法在不重新实例化类的情况下重新初始化 Lazy Func 方法?如果没有,有没有办法将它作为扩展方法来实现,或者只是一个糟糕的模式可以遵循?

【问题讨论】:

  • “为什么不”的问题只是咆哮。你能用更有建设性的方式改写一下吗?
  • 我猜是因为它被视为一个值而另一个值不是同一个值。
  • 您似乎想懒惰地重新创建实例?如果是这样,那么这不是这个(或任何惰性初始化类)类的意图。实例被创建一次,但只是在它被使用之前(并且只有在它被使用时)。

标签: .net c#-4.0


【解决方案1】:

因为不可能使它成为线程安全的。 保证程序员会在没有任何方法解决问题的情况下一败涂地的类不属于框架。您可以随意射击自己的腿。

【讨论】:

  • 线程安全是 Lazy 类的一个选项 - 甚至可能不是默认值。因此,这个答案并不适用。
  • 为什么不可能让它成为线程安全的?这不只是锁块内的更新和两个属性(IsValueCreatedValue)上的一些额外锁吗?我不是多线程方面的专家,但乍一看似乎可行……
【解决方案2】:

你想要做的不是延迟初始化,而是别的东西。这就是为什么它不在 Lazy&lt;T&gt; 类上的原因。

【讨论】:

    【解决方案3】:

    因为这会破坏类型的语义。如果Lazy&lt;T&gt; 的状态随着时间的推移变得无效,您需要考虑其他类型。

    【讨论】:

      【解决方案4】:

      如果你真的需要重置你的 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>();
      }
      

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

      【讨论】:

        【解决方案5】:

        IsValueCreated 不适合你吗?

        【讨论】:

        • IsValueCreated 是只读的...如果该属性有一个设置器并导致在下一次使用时发生重新初始化。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-19
        • 1970-01-01
        • 1970-01-01
        • 2021-04-05
        • 2023-03-13
        • 2015-05-08
        相关资源
        最近更新 更多