延迟初始化

2005年12月5日

延迟初始化是一种在第一次访问时初始化变量(在面向对象上下文中通常是类的字段)的技术。它的典型形式是这样的

public FooClass Foo {
  get {
    if (_foo = null) _foo = calculateFoo();
    return _foo;
  }
}

延迟初始化在计算字段值需要很长时间并且您不想在实际需要该值之前进行计算时很有用。因此,它在许多情况下很有用,例如字段在许多上下文中不需要,或者我们希望快速初始化对象,并且希望任何延迟都发生在稍后的时间。

请记住,这是一种优化技术,可以帮助在客户端不需要延迟初始化的值的情况下提高响应速度。与任何优化一样,除非您遇到真正的性能问题,否则不应使用这种技术。

特别是,延迟初始化会导致调试问题,因为如果您尝试在调试期间查看字段,您将导致系统中不会在正常使用情况下发生的状态更改。(虽然ObservableState不会改变实际状态,但它确实会改变。)这会导致在添加打印语句时错误似乎消失的情况——这总是导致周五下午出现严重溃疡的良方。