11

私はC#で自動実装されたプロパティが大好きですが、最近、この象が私のキュービクルに立っていて、彼をどうするかわかりません。

自動実装されたプロパティ(以下「aip」)を使用すると、内部で使用するプライベートバッキングフィールドがなくなります。aipには副作用がないため、これは問題ありません。しかし、後でgetまたはsetに追加の処理を追加する必要がある場合はどうなりますか?

次に、ゲッターとセッターを拡張できるように、バッキングフィールドを作成する必要があります。クラスを使用する外部コードでは、違いに気付かないため、これは問題ありません。しかし、現在、aipへのすべての内部参照は、プロパティにアクセスするときにこれらの副作用を引き起こします。ここで、バッキングフィールドを使用するには、onceaipへのすべての内部アクセスをリファクタリングする必要があります。

だから私の質問は、あなたのほとんどは何をしているのですか?自動実装されたプロパティを使用しますか、それとも常にバッキングフィールドを使用しますか?副作用のあるプロパティについてどう思いますか?

4

5 に答える 5

6

Eric Lippert は、この質問に答える素晴らしいブログ投稿をしています。

自動的に実装されたプロパティから明示的に実装されたプロパティへの変更を動機付けた理由が、プロパティのセマンティクスを変更することであった場合、クラス内からプロパティにアクセスするときの目的のセマンティクスが、アクセスするときの目的のセマンティクスと同じか異なるかを評価する必要があります。クラス外からのプロパティ。

その調査の結果が「クラス内から、このプロパティにアクセスする目的のセマンティクスが、外部からプロパティにアクセスする目的のセマンティクスと異なる」場合、編集によってバグが発生しています。バグを修正する必要があります。それらが同じである場合、編集によってバグが発生したことはありません。実装を同じに保ちます。

于 2010-03-16T18:24:58.803 に答える
3

まず第一に、プロパティ ゲッターには副作用があってはなりません。常にそうであるとは限りませんが、そうでないことには十分な理由があるはずです。

そうは言っても、プロパティへの参照のリストを取得するのは簡単です。明示的なプロパティに変更し、プライベート コードで新しいバッキング変数にアクセスする場合は、かなり簡単に変更できます。

于 2010-03-16T18:27:44.680 に答える
1

自動実装されたプロパティを使用しても問題はありません。あなたがいくつかの財産を持っていると想像してください:

public string Name 
{
    get; set;
}

将来、追加の処理が必要になる場合は、プロパティを変更するだけです。

private string name;

public string Name 
{
    get { return this.name; }
    set 
    {
       if (!string.IsNullOrEmpty(value))
       { 
           this.name = value;
       }
    }
}
于 2010-03-16T18:26:23.293 に答える
0

コマンドを質問から分離するという点では、副作用のあるプロパティを持つことはあまり良いことではありません。何かが変更される可能性があることを明確に示すメソッドを呼び出していない限り、オブジェクトが同じように質問に回答することを好みます。

于 2010-03-16T18:26:24.753 に答える
0

バッキング フィールドが必要になるまでは、常に AIP を使用します。交換するのはそれほど難しくありません:

public string MyString{get;set;}

為に

private string myString;
public string MyString{get{return myString;} set{myString = value;}}

常に後者にするのは無用な混乱だと思います。

于 2010-03-16T18:26:49.150 に答える