有没有简单的方法来返回可能为空的值?

我怎样才能写出以下情况的简写?

get { if (_rows == null) { _rows = new List<Row>(); } return _rows; } 

使用空合并运算符 (??):

 get { _rows = _rows ?? new List<Row>(); return _rows; } 

OR(较不可读):

 get { return _rows ?? (_rows = new List<Row>()); } 

?? 运算符称为空合并运算符。 如果操作数不为null,则返回左边的操作数; 否则返回右手操作数。

这是懒惰的初始化模式,所以直接的方法是使用Lazy <T>类。

 class Foo { Lazy<List<Row>> _rows; public Foo() { _rows = new Lazy(() => new List<Row>()); } public List<Row> Rows { get { return _rows.Value; } } } 

这具有额外的优点,即它不会用初始化逻辑“污染”获取器。

我build议三元操作符

 get { return _rows == null ? _rows = new List<Row>() : _rows; } 

或者,因为空List<Row>不会带来太多的开销,为什么不摆脱显式_row字段和实现只读属性( C#6.0语法):

 public IList<Row> Rows {get;} = new List<Row>(); 

这里有一个更好的主意: 防止_rows null

让你的构造函数初始化variables:

 public MyClass() { this._rows = new List<Row>(); } 

然后你的财产是公正的

 get { return this._rows; } 

确保如果您需要“清除”variables,则始终调用其Clear方法或分配一个新的空列表,而不是分配null 。 如果你真的需要在整个class级中清楚和一致的话,也许在一个方法中编码这个操作。

这更合乎逻辑。 如果你的variables不能为null它不应该是null 。 它也巧妙地避免了条件问题和获取修改状态的问题。

 List<Row> _rows; public List<Row> Rows => _rows ?? (_rows = new List<Row>()); 

正如其他人所说,在这种情况下可以使用空合并运算符。

 get { return _rows ?? (_rows = new List<Row>()); } 

值得注意的是,这是ReSharper擅长的一种改变(他们称之为“ 快速修复” )。

在你的例子中,它会在if语句下放一个小小的曲线。 将鼠标hover在上面,可以看出如何更改/简化代码。

转换成 '??'表达

稍后再点击几下,就可以实现更改。

在这里输入图像说明

像这样的例子:

 get{ return _rows ?? (_rows = new List<Row>()); } 

如果你希望你的代码像你当前的代码一样行事,当属性被访问的时候,懒惰地初始化你的后台字段,那么是的,你可以缩短它。 你可以重命名你的支持领域,因为回答已经使用?? 把所有内容放在一个expression式中,当你有了这个expression式时,使用C#6的新属性语法来避免写入getreturn

 List<Row>_;List<Row> Rows=>_??(_=new List<Row>()); 

希望在这之前,你会看到你已经把简单易懂的代码变成了你想要的东西,变成一个你永远不想要的东西。

只要保持你的代码完全一样。 如图所示,你可以缩短它,但这并不会让它变得更好。

如果问题是需要更多时间来编写,因为您一直在反复input相同的代码,许多IDE提供了一些function来插入模板,代码片段或任何他们使用的术语。 这可以让你定义一些东西

 {Type} {Field}; public {Type} {Property} { get { if ({Field} == null) { {Field} = new {Type}(); } return {Field}; } } 

然后你的编辑器会提示你input具体的{Type},{Field},{Property},而不必每次都重新input。

 return _rows ?? (_rows = new List<Row>()); 

如果你真的想缩短它,我只是删除额外的括号。

  get { if (_rows == null) _rows = new List<Row>(); return _rows; } 

您可以通过以下任何方式来完成此操作:

  • 条件运算符(?:)
  • 空合并运算符(??)

有了条件运算符

 get { return _rows == null ? new List<Row>() : _rows; } 

空合并运算符

 get { return _rows ?? new List<Row>(); }