13

考虑这个例子,它展示了两种可能的延迟初始化方式。除了线程安全之外,在这里使用 Lazy<T> 是否有任何特定的优势?

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; }
    }
}

更新:

请把上面的代码当作一个简单的例子,数据类型无关紧要,这里的重点是比较惰性 <T> 和标准惰性初始化。

4

1 回答 1

5

它在语义上更正确。

当您使用 时Nullable<decimal>,您所说的是 的值null将代表“未评估”状态。虽然这是一种常见的转换,但它仍然是任意的。有数百万种其他方式来解释null,因此您可能应该在某个地方(在文档中或至少作为评论)解释 null 在这种情况下意味着什么。

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

于 2011-07-25T08:02:13.333 回答