使用 null 合併運算子初始化延遲屬性
private List<FooBar> _fooBars;
public List<FooBar> FooBars
{
get { return _fooBars ?? (_fooBars = new List<FooBar>()); }
}
第一次訪問屬性 .FooBars
時,_fooBars
變數將評估為 null
,因此通過賦值語句分配並評估結果值。
執行緒安全
這不是實現惰性屬性的執行緒安全方法。對於執行緒安全的懶惰,請使用 .NET Framework 中內建的 Lazy<T>
類。
C#6 使用表達體的語法糖
請注意,從 C#6 開始,可以使用屬性的表示式主體簡化此語法:
private List<FooBar> _fooBars;
public List<FooBar> FooBars => _fooBars ?? ( _fooBars = new List<FooBar>() );
對屬性的後續訪問將產生儲存在 _fooBars
變數中的值。
MVVM 模式中的示例
在 MVVM 模式中實現命令時經常使用此方法。使用此模式延遲初始化命令,而不是通過構建檢視模型急切地初始化命令,如下所示:
private ICommand _actionCommand = null;
public ICommand ActionCommand =>
_actionCommand ?? ( _actionCommand = new DelegateCommand( DoAction ) );