62

次のシナリオの省略形を書くにはどうすればよいですか?

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

    return _rows;
}
4

11 に答える 11

81

null 合体演算子( ?? )の使用:

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

または (読みにくい):

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

?? 演算子は null 合体演算子と呼ばれます。オペランドが null でない場合は左側のオペランドを返します。それ以外の場合は、右側のオペランドを返します。

于 2016-07-08T12:37:58.370 に答える
18

より良いアイデアは次のとおりです。_rowsnull

コンストラクターに変数を初期化させます。

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

そして、あなたの財産はただ

get
{
    return this._rows;
}

変数を「クリア」する必要がある場合は、常にそのClearメソッドを呼び出すか、を割り当てる代わりに新しい空のリストを割り当てるようにしてnullください。クラス全体で明確かつ一貫したものにする必要がある場合は、その操作をメソッドにエンコードすることもできます。

これははるかに論理的です。変数が であってはならない場合はnullであってはなりませんnull。また、条件と getter の変更状態の問題の両方をきちんと回避します。

于 2016-07-08T21:20:03.500 に答える
12
List<Row> _rows;
public List<Row> Rows => _rows ?? (_rows = new List<Row>());
于 2016-07-08T12:44:04.050 に答える
10

他の人が言ったように、このシナリオでは null 合体演算子を使用できます。

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

これは、ReSharperが提案するのが得意な種類の変更であることは注目に値します (彼らはこれをクイックフィックスと呼んでいます)。

ifあなたの例では、ステートメントの下に小さな波線を置きます。カーソルを合わせると、コードを変更/簡略化する方法の提案が表示されます。

に変換 '??'  表現

数回クリックすると、変更が実装されます。

ここに画像の説明を入力

于 2016-07-08T15:01:44.907 に答える
5

たとえば、次のようにします。

get{ return _rows ?? (_rows = new List<Row>()); }
于 2016-07-08T12:42:40.360 に答える
1
return _rows ?? (_rows = new List<Row>());
于 2016-07-08T12:37:40.137 に答える
0

本当に短くしたい場合は、余分なブラケットを削除します.

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

        return _rows;
    }
于 2016-07-08T12:46:32.343 に答える