如何编写以下方案的简写?
get
{
if (_rows == null)
{
_rows = new List<Row>();
}
return _rows;
}
答案 0 :(得分:81)
使用null-coalescing operator(??):
get
{
_rows = _rows ?? new List<Row>();
return _rows;
}
OR(不太可读):
get { return _rows ?? (_rows = new List<Row>()); }
?? operator被称为null-coalescing运算符。它返回 如果操作数不为空,则为左操作数;否则它返回 右手操作。
答案 1 :(得分:41)
这是一个懒惰的初始化模式,所以直截了当的方法是使用Lazy<T>类。
class Foo
{
Lazy<List<Row>> _rows;
public Foo()
{
_rows = new Lazy(() => new List<Row>());
}
public List<Row> Rows
{
get { return _rows.Value; }
}
}
这具有额外的优点,即它不会污染&#34;具有初始化逻辑的getter。
答案 2 :(得分:20)
我建议使用三元运算符
get {
return _rows == null ? _rows = new List<Row>() : _rows;
}
或者因为空List<Row>
没有带来太多开销,为什么不摆脱显式_row
字段并实现只读属性( C#6.0 语法) :
public IList<Row> Rows {get;} = new List<Row>();
答案 3 :(得分:18)
以下是一个更好的主意:防止_rows
成为null
。
让构造函数初始化变量:
public MyClass()
{
this._rows = new List<Row>();
}
然后你的财产只是
get
{
return this._rows;
}
确保如果您需要&#34;清除&#34;变量,您始终调用其Clear
方法或指定新的空列表,而不是分配null
。如果您真的需要在整个班级中使其清晰且一致,可能会在方法中对该操作进行编码。
这很多更符合逻辑。如果您的变量永远不应该是null
,那么永远不应该是null
。它还巧妙地避免了条件和具有getter修改状态的问题。
答案 4 :(得分:12)
List<Row> _rows;
public List<Row> Rows => _rows ?? (_rows = new List<Row>());
答案 5 :(得分:10)
正如其他人所说,您可以在此方案中使用null-coalescing运算符。
get
{
return _rows ?? (_rows = new List<Row>());
}
值得注意的是,这是ReSharper非常善于建议的变化(他们称之为quick-fix)。
在您的示例中,它会在if
语句下放置一个小的波形。将鼠标悬停在其上会显示suggestion代码如何更改/简化代码。
稍后点击几下,即可实施更改。
答案 6 :(得分:5)
就像这样:
get{ return _rows ?? (_rows = new List<Row>()); }
答案 7 :(得分:3)
如果您希望代码的行为与当前代码相似,则在访问属性时懒洋洋地初始化您的支持字段,然后是,您可以缩短代码。您可以重命名支持字段,因为已经使用??
回答将所有内容放在单个表达式中,当您拥有该单个表达式时,请使用C#6的新属性语法来避免编写get
和{{1 }}:
return
希望,在你达到这一点之前,你会发现你已经变成了易于理解的代码,它可以完全按照你想要的方式完成你永远不想要维护的混乱。
保持您的代码完全不变。你可以缩短它,如图所示,但这并没有使它更好。
如果问题是需要更多时间来编写,因为您不断反复键入相同的代码,许多IDE提供了一些功能来插入模板,代码段或它们用于它的任何术语。这使您可以按照
的方式定义某些内容List<Row>_;List<Row> Rows=>_??(_=new List<Row>());
然后,您的编辑会提示您输入特定的{Type},{Field},{Property},而不必每次都再次输入。
答案 8 :(得分:1)
return _rows ?? (_rows = new List<Row>());
答案 9 :(得分:0)
如果你真的想缩短它,我会删除额外的括号。
get
{
if (_rows == null)
_rows = new List<Row>();
return _rows;
}
答案 10 :(得分:0)
您可以通过以下任何方式执行此操作:
- 条件运算符(?:)
- Null-coalescing运算符(??)
使用条件运算符
get {
return _rows == null ? new List<Row>() : _rows;
}
空合并运算符
get {
return _rows ?? new List<Row>();
}