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