使用 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 ) );