延遲初始化
2005 年 12 月 5 日
延遲初始化是一種初始化變數(在 OO 語境中通常是類別的欄位)的技術,會在第一次存取時初始化。它的正規形式類似於以下內容
public FooClass Foo { get { if (_foo = null) _foo = calculateFoo(); return _foo; } }
當計算欄位的值很耗時,而且你不想在實際需要值之前執行計算時,延遲初始化會很有用。因此,它通常在許多語境中不需要欄位,或者我們希望快速初始化物件,並希望稍後再延遲的情況下很有用。
請記住,這是一種最佳化技術,有助於在客戶端不需要延遲初始化值的情況下提高回應性。與任何最佳化一樣,除非你有真正的效能問題需要解決,否則不應使用此技術。
特別是,延遲初始化可能會導致除錯問題,因為如果你嘗試在除錯期間查看欄位,你會在系統中造成狀態變更,而這在正常使用下不會發生。(雖然 ObservableState 沒有變更實際狀態。)這可能會導致在新增列印陳述式時錯誤似乎消失的情況 - 這總是週五下午造成嚴重潰瘍的良方。