web-dev-qa-db-ja.com

C#のメソッドとプロパティ-違いは何ですか

重複の可能性:
プロパティvsメソッド

メソッドでは、コードやプロパティにも入力できます。たとえば、プロパティNameがあります。クラス名が変更されたときに、データベースからデータを取得して、オブジェクトの状態を変更したいと考えています。このコードを追加して、プロパティの一部を設定できます。他の解決策は、セットパーツをプライベートに変更し、SetNameというメソッドを追加して、このメソッドにコードを追加することです。

違いは何ですか?ゲッター/セッターにコードを配置するのがよくないときや、プロパティやクラスの他の部分を変更するために使用する独自のメソッドをいつ作成するのがよいのでしょうか。

35

Bill Wagner (固定リンク)のプロパティとメソッドをいつ使用するかについてのガイドラインの適切なセットを次に示します。

  • これらがすべて当てはまる場合は、プロパティを使用します。ゲッターは単純である必要があり、例外をスローする可能性は低いです。これは、ネットワーク(またはデータベース)アクセスがないことを意味することに注意してください。どちらかが失敗する可能性があるため、例外がスローされます。
  • それらは互いに依存関係があってはなりません。これには、1つのプロパティの設定と別のプロパティへの影響が含まれることに注意してください。 (たとえば、FirstNameプロパティを設定すると、姓と名のプロパティで構成された読み取り専用のFullNameプロパティに影響し、そのような依存関係が示唆されます)
  • それらは任意の順序で設定可能でなければなりません
  • ゲッターには目に見える副作用はありません。このガイドラインは、プロパティでの遅延評価の一部の形式を排除していません。
  • メソッドは常にすぐに戻る必要があります。 (これにより、データベースアクセス呼び出し、Webサービス呼び出し、または他の同様の操作を行うプロパティが除外されることに注意してください)。
  • メンバーが配列を返す場合は、メソッドを使用します。
  • (介入コードなしで)ゲッターを繰り返し呼び出すと、同じ値が返されます。
  • (同じ値で)セッターを繰り返し呼び出しても、1回の呼び出しと違いはありません。

  • Getは、内部データ構造への参照を返しません(項目23を参照)。メソッドはディープコピーを返すことができ、この問題を回避できます。

55
Chris Ballance

このようなプロパティが与えられた

private string _name;
public string Name { get { return _name; } set { _name = value; } }

次の2つのメソッドを記述することができます。

public string get_Name() { return _name; }
public void set_Name(string value) { _name = value; }

同じように動作します。そして実際、これはまさに、プロパティを作成するときにコンパイラが行うことです。

一般的に言って、プロパティ内のコードが「高価」だと感じ始めたときは、それが理にかなっている場合は、プロパティから離れます。プロパティをフィールドのように感じさせ(特定の時間に発生する制御された副作用があるため)、軽量にする必要があります。

12
plinth

プロパティは構文糖にすぎません。場合によっては、より明確で読みやすいため、メソッドではなくプロパティを定義する方が適切です。

設計ガイドラインでは、実装している機能にコストがかかる場合、プロパティよりもメソッドを優先する必要があると述べています。

実際、プロパティは1つまたは2つのメソッドとして実装されます。プロパティにセッターがあるかどうかによって異なります。プロパティは、get_xxxおよびset_xxxメソッドに変換されます。

8

考えてみると、プロパティは単なる構文上の糖衣ではありません。それらは、メンバーコードに対するメンバーデータの公開面です。

したがって、コードからメンバーデータの1つの側面を取得または入力するためのクリーンなレイヤーを提供します。

たとえばDTOは、適切に記述されたプロパティの集まりにすぎず、データと動作を効率的に切断します。 DTOがなければ、DataGridまたはDropdownを複雑なビジネスロジックメソッドに密結合することを想像できますか?

簡単に言えば、メソッドは実際に作業を行っています...プロパティはアクションを引き起こすか、ステータスを取得します。

ただし、プロパティ内でメソッドコードを使用できます...必要な場合でも、実際にコードを記述するのではなく、プロパティ内の別のメソッドをクリーンに呼び出すほうが得策です。 HTH!

4
Jarvis Bot

コードをゲッター/セッターに配置する必要が出てきたときはいつでも、コードをプライベートメソッドに配置し、そのメソッドをゲッター/セッター内から呼び出します。そうすれば、コードがメソッド呼び出しで利用できるようになります。これがあなたが求めていた答えかどうかはわかりませんが、それは私が使用する方法論にすぎません。

3
Scott Vercuski

基本的に違いはありません(セッターの予約済み識別子「値」を除いて)。

ゲッターとセッターは内部で標準メソッドに変換されるため、ランタイムは、ゲッターまたはセッターが特定のプロパティに関連付けられているかどうかがわかりません。構文糖という用語は、このような便利な構成要素によく使用されます。

ただし、ソフトウェアエンジニアリングには重要なメリットがあります。getおよびsetセマンティクスでゲッターとセッターを使用するように制限すると、コードが理解しやすくなる傾向があります。つまりそれぞれのプロパティを提供するために必要な手順のみを実行してください。

少し余分な作業を行う一般的な使用例は、たとえば、メンバーフィールドによって直接バッキングされないプロパティの設定または取得です。たとえば、距離を表す値などを含むクラスがあるとします。クラスは2つのプロパティを提供できます。それぞれのセッターとゲッターを持つキロメートルとマイルです。次に、1つのペアで単純な変換を行い、値を2回保存するために自分自身を保存します。

一般的な経験則として、副作用のあるゲッターにコードを配置しないでください。また、セッターのコードが持つべき唯一の副作用は、セッターが参照するオブジェクトの状態の変化です。

2
user158516

基本的に、プロパティはgetPropertyとsetPropertyの2つのメソッドです。事柄の慣例/簡略化のみです。

プロパティゲッターには副作用がないと想定されています(まあ-遅延読み込みのような特定の副作用があるかもしれません)。

1
Rashack

これはおそらく最も重要な違いではありませんが、違いの1つは、プロパティをステップオーバーするようにデバッガーを構成できることです(コードが簡単であると想定)。

1
ChrisW