有没有简单的方法来返回可能为空的值?
我怎样才能写出以下情况的简写?
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的新属性语法来避免写入get
和return
:
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>(); }