2

C#パブリックプロパティのゲッターとセッターに操作を自由に追加できますか?どの程度?
たとえば、次のコードは問題ありませんか(別のコレクションにネストされているコレクションを返し、編集します)?

public ObservableCollection<MyEntity> MyCollection
{
   get
   {
     return myColl.Where(p => p.Name == myName).FirstOrDefault().AnotherCollection;
   }
   private set
   {
     myColl.Where(p => p.Name == myName).FirstOrDefault().AnotherCollection = value;
   }
}
4

5 に答える 5

5

唯一の限界はセマンティクスです。一般的なプロパティのセマンティクスが保持されている限り、適切と思われる操作を使用できます。とりわけ、私はそれをチェックします

  • アクセスは適度に速い
  • セッターがエラーなしで終了した場合、ゲッターは設定値と意味的に互換性のある値を返す必要があります
  • 可能であれば、内部で例外を発生させないでください
  • 内部状態が変化しなかった場合、連続して意味的に同等の値が返されます

セマンティクスを保持する場合、IMHOの任意の操作が許可されます。

于 2012-08-31T11:36:15.957 に答える
2

現実的には、プロパティのゲッターとセッター内に必要なものをほとんど追加できます。事実上、これらはこれを書くことを避ける簡単な方法にすぎません。

private String _value;
public String GetValue
{
    return _value;
}
public void SetValue(string value)
{
    _value = value;
}

したがって、メソッドで実行できる場合は、プロパティで実行できます(必ずしもそうする必要があるとは限りません)。

何が適切かというと、その多くは文脈に依存し、多くの人が異なる意見を持っています。私が従おうとしている一般的なガイドラインは次のとおりです。

  1. 時間がかかりすぎることはしないでください。プロパティは高速であることが期待されます。
  2. Exceptionそれが文書化され、それが理にかなっている場合を除いて、スローするものを入れないでください。コードを壊すプロパティの値を使用するArgumentExceptionNullReferenceException、説明する必要がある場合は、例外が必要な場合、またはプロパティ自体に関係のない例外が発生する可能性のあるメソッドを呼び出す場合は、メソッドの方が適しています。
  3. 常識を使用してください。あなたが自分自身に、私がしたい、getまたはset値を言うことができるなら、プロパティは理にかなっています。私がしたいdo somethingのなら、あなたはおそらく方法を使ったほうがいいでしょう。
  4. これは#1に戻りますが、取得または設定するバッキングフィールドがない場合(自動プロパティはとにかくバックグラウンドでこれを行います)、プロパティが本当に正しいアプローチであるかどうかを考える必要があります。

しかし、私が言ったように、これらは私のガイドラインであり、私は時々それらを破ります、しかし私がそうするとき、私はプロパティが例外のない、または長期的な何かをするつもりであることが文書化されることを確認する傾向があります。

あなたの例は、またはの場合に例外をスローするmyColl可能性があるため、どちらもnullになる可能性が100%確実でない限り、これをプロパティにすることはありません。pnull

于 2012-08-31T11:54:50.270 に答える
1

私は2つのルールがあると思います:

  1. 常識-あなたがそれがそのようであるべきではないと思うなら。それなら、おそらくそのようにはならないはずです。
  2. 驚き最小の原則
于 2012-08-31T11:37:33.907 に答える
1

あなたが提供したコードには「悪いコード」の臭いがあります。

  1. FirstOrDefault関数を使用しました。null値を持つ可能性があります。

  2. myName変数はクラスレベルの変数のようです。次に、プロパティで複数のクラスレベル変数(myCollとmyName)を使用しているようです。それは私には少し奇妙に思えます。

    AnotherCollection3.リストの最初のアイテムのプロパティであるディープオブジェクトを返しているようです。これは問題につながる可能性があります。仮に;

a。myColl無効である、

b。myValue無効である、

c。FirstOrDefaultnullを返し、

d。AnotherCollection無効である。

于 2012-08-31T11:42:10.397 に答える
0

私の意見では大丈夫です、

醜いと言う人もいれば、有効か、大丈夫だと言う人もいます。

get / setは、get()やset()のような詳細な2つのメソッドです。

「一般的な」コーディングガイドラインとは何ですか?

于 2012-08-31T11:32:08.470 に答える