Lazy <t>提供了什么优于标准的懒惰实例化?</t>

时间:2011-07-25 07:44:24

标签: c# lazy-initialization

考虑这个例子,它显示了两种可能的延迟初始化方法。 除了线程安全之外,使用Lazy&lt; T&gt;是否有任何特定的优点。这里吗?

class Customer {
    private decimal? _balance2;
    private static decimal GetBalanceOverNetwork() {
        //lengthy network operations
        Thread.Sleep(2000);
        return 99.9M;
    }

    public decimal? GetBalance2Lazily() {
        return _balance2 ?? (_balance2 = GetBalanceOverNetwork());
    }

    private readonly Lazy<decimal> _balance1 = new Lazy<decimal>(GetBalanceOverNetwork);

    public Lazy<decimal> Balance1 {
        get { return _balance1; }
    }
}

更新:

请考虑上面的代码作为一个简单的例子,数据类型是无关紧要的,这里的重点是比较Lazy&lt; T&gt;。超过标准的延迟初始化。

1 个答案:

答案 0 :(得分:5)

语义上更正确。

当您使用Nullable<decimal>时,您所说的是null的值将代表“未评估”状态。虽然这是一种常见的转换,但它仍然是任意的。有许多其他方法可以解释null,所以你应该在某处(在文档中或至少作为注释)解释在这种情况下null意味着什么。

相反,当您使用Lazy<decimal>时,您的意图很明确。