10

このコードを書く価値はありますか?

RelayCommand _saveCommand;
public ICommand SaveCommand
{
    get
    {
        if (_saveCommand == null)
        {
            _saveCommand = new RelayCommand(this.Save);
        }
        return _saveCommand;
    }
}

毎回新しいオブジェクトを返すのではなく、次のようにします。

public ICommand SaveCommand
{
    get { return new RelayCommand(this.Save); }
}

私が知っていることから、コマンドゲッターはめったに使用されず、RelayCommandのコンストラクターは非常に高速です。より長いコードを書く方が良いですか?

4

3 に答える 3

11

null合体演算子が好き

public ICommand SaveCommand 
{ 
    get { return _saveCommand ?? (_saveCommand = new RelayCommand(this.Save); }
}

オペランドが null でない場合は左側のオペランドを返し、それ以外の場合は右側のオペランドを返します。

于 2012-06-19T11:44:31.263 に答える
6

この設計は、クラスのユーザーにとって誤解を招く可能性があります。たとえば、何千回も反復するループでプロパティの値を読み取ることができます。これにより、多くの新しいオブジェクトが作成されますが、ユーザーはおそらくそれを期待していません。

StyleCop warning CA1819: Properties should not return arrayのドキュメントを参照してください- これは非常によく似た問題です。

通常、ユーザーは、このようなプロパティを呼び出すことによるパフォーマンスへの悪影響を理解していません。具体的には、プロパティをインデックス付きプロパティとして使用する可能性があります。

さらに、SaveCommand == SaveCommandfalse になります。これは直感に反すると思います。

要約すると、これは最適な設計ではないかもしれませんが、コードのユーザーがコードの仕組みと適切な使用方法を知っていれば問題ありません。

于 2012-06-19T11:55:00.800 に答える
1

はい、毎回新しいオブジェクトを返すのは良くありません。なぜそれをするのですか?何らかの理由でゲッターが何度も呼び出されると、毎回新しいオブジェクトがメモリ内に作成されます。この 1 つの分離されたインスタンスに対してのみそれを行う場合、それほどひどいことではありません。しかし、この方法でプログラミングする習慣を身につけると、見つけにくい問題が発生し、保守が困難なコード ベースが作成されます。常にシンプルで、クリーンで、エレガントであり、最終的にはクリーンで保守しやすいコード ベースを作成することをお勧めします。

ちなみに、フィールドを宣言するときはいつでもフィールドを初期化できます。

RelayCommand _saveCommand = new RelayCommand(this.Save);

次に、ゲッターはこれだけを必要とします:

return _saveCommand;
于 2012-06-19T12:45:21.713 に答える