次のシナリオの省略形を書くにはどうすればよいですか?
get
{
if (_rows == null)
{
_rows = new List<Row>();
}
return _rows;
}
次のシナリオの省略形を書くにはどうすればよいですか?
get
{
if (_rows == null)
{
_rows = new List<Row>();
}
return _rows;
}
null 合体演算子( ?? )の使用:
get
{
_rows = _rows ?? new List<Row>();
return _rows;
}
または (読みにくい):
get { return _rows ?? (_rows = new List<Row>()); }
?? 演算子は null 合体演算子と呼ばれます。オペランドが null でない場合は左側のオペランドを返します。それ以外の場合は、右側のオペランドを返します。
より良いアイデアは次のとおりです。_rows
null
コンストラクターに変数を初期化させます。
public MyClass()
{
this._rows = new List<Row>();
}
そして、あなたの財産はただ
get
{
return this._rows;
}
変数を「クリア」する必要がある場合は、常にそのClear
メソッドを呼び出すか、を割り当てる代わりに新しい空のリストを割り当てるようにしてnull
ください。クラス全体で明確かつ一貫したものにする必要がある場合は、その操作をメソッドにエンコードすることもできます。
これははるかに論理的です。変数が であってはならない場合はnull
、であってはなりませんnull
。また、条件と getter の変更状態の問題の両方をきちんと回避します。
List<Row> _rows;
public List<Row> Rows => _rows ?? (_rows = new List<Row>());
他の人が言ったように、このシナリオでは null 合体演算子を使用できます。
get
{
return _rows ?? (_rows = new List<Row>());
}
これは、ReSharperが提案するのが得意な種類の変更であることは注目に値します (彼らはこれをクイックフィックスと呼んでいます)。
if
あなたの例では、ステートメントの下に小さな波線を置きます。カーソルを合わせると、コードを変更/簡略化する方法の提案が表示されます。
数回クリックすると、変更が実装されます。
たとえば、次のようにします。
get{ return _rows ?? (_rows = new List<Row>()); }
return _rows ?? (_rows = new List<Row>());
本当に短くしたい場合は、余分なブラケットを削除します.
get
{
if (_rows == null)
_rows = new List<Row>();
return _rows;
}