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

Val*_*yev 12 c# lazy-initialization

考虑这个例子,它显示了两种可能的延迟初始化方法.除了线程安全之外,在这里使用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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

请将上面的代码视为一个简单的例子,数据类型是无关紧要的,这里的重点是比较Lazy <T>而不是标准的延迟初始化.

lin*_*ogl 5

它在语义上更正确.

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

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