.NET では、クラスにクラス オブジェクトであるメンバーが含まれている場合、そのメンバーをプロパティとして、またはメソッドで公開する必要がありますか?
7 に答える
オブジェクトの状態を概念的に表すものには、プロパティを使用する必要があります。ただし、その取得が、繰り返し使用することを避けるほど高価な操作ではない限りです。
MSDNから:
クラス ライブラリの設計者は、多くの場合、クラス メンバーをプロパティとして実装するか、メソッドとして実装するかを決定する必要があります。一般に、メソッドはアクションを表し、プロパティはデータを表します。これらのオプションを選択するには、次のガイドラインを参考にしてください。
メンバーが論理データ メンバーの場合は、プロパティを使用します。次のメンバー宣言では、Name はクラスの論理メンバーであるため、プロパティです。
public string Name get { return name; } set { name = value; }
次の場合にメソッドを使用します。
- 操作は、Object.ToString などの変換です。
- 操作のコストが高いため、結果のキャッシュを検討する必要があることをユーザーに伝えたい場合。
- get アクセサーを使用してプロパティ値を取得すると、目に見える副作用が生じます。
- メンバーを 2 回続けて呼び出すと、異なる結果が生成されます。
- 実行順序は重要です。型のプロパティは、任意の順序で設定および取得できる必要があることに注意してください。
- メンバーは静的ですが、変更可能な値を返します。
メンバーは配列を返します。配列を返すプロパティは、非常に誤解を招く可能性があります。通常、ユーザーが内部状態を変更できないように、内部配列のコピーを返す必要があります。これは、ユーザーがインデックス付きのプロパティであると簡単に想定できるという事実と相まって、非効率的なコードにつながります。次のコード例では、Methods プロパティを呼び出すたびに配列のコピーが作成されます。その結果、配列の 2n+1 個のコピーが次のループで作成されます。
Type type = // Get a type. for (int i = 0; i < type.Methods.Length; i++) { if (type.Methods[i].Name.Equals ("text")) { // Perform some operation. } }
次の例は、プロパティとメソッドの正しい使用法を示しています。
class Connection { // The following three members should be properties // because they can be set in any order. string DNSName {get{};set{};} string UserName {get{};set{};} string Password {get{};set{};} // The following member should be a method // because the order of execution is important. // This method cannot be executed until after the // properties have been set. bool Execute (); }
現在のオブジェクトの状態に関連するオブジェクト インスタンスを公開するだけの場合は、プロパティを使用する必要があります。
メソッドは、メモリ内オブジェクトにアクセスしてその値を返す以上のことを行うロジックがある場合、または現在のオブジェクトの状態に広範な影響を与えるアクションを実行している場合に使用する必要があります。
それは問題とは関係ありません。
値がオブジェクトの状態に関する詳細である場合、それはプロパティである必要があります。
オブジェクトに対して何らかのアクションを実行する場合は、メソッドである必要があります。
財産。プロパティは基本的に単なる「安価な」メソッドです。オブジェクトへの参照の取得または設定は非常に安価です。
明確にするために、プロパティは通常、オブジェクトの内部状態を表すと想定されています。ただし、メンバーをプロパティまたはメソッドとして実装すると、ユーザーは呼び出しのコストが高くなる可能性が高くなります。
プロパティは、値を読み取り、クラス内のインスタンスに割り当てます。
メソッドは、クラスに割り当てられたデータで何かを行います。
概要
一般に、プロパティはNameなどのオブジェクトのデータを格納し、メソッドは、 MoveやShowなど、オブジェクトに実行を要求できるアクションです。どのクラス メンバーがプロパティでどれがメソッドであるかが明確でない場合があります。コレクション クラス (VB) のItemメソッドは、データを格納および取得し、インデックス付きプロパティとして実装できます。一方、Itemをメソッドとして実装することも合理的です。
構文
クラス メンバーがどのように使用されるかは、それをプロパティとして表現するかメソッドとして表現するかの決定要因になる可能性もあります。パラメーター化されたプロパティから情報を取得するための構文は、関数として実装されたメソッドに使用される構文とほとんど同じです。ただし、そのような値を変更するための構文は少し異なります。
クラスのメンバーをプロパティとして実装する場合は、その値を次のように変更する必要があります。
ThisObject.ThisProperty(Index) = NewValue
クラス メンバーがメソッドとして実装されている場合、変更される値は引数を使用して変更する必要があります。
ThisObject.ThisProperty(インデックス、新しい値)
エラー
読み取り専用プロパティに値を割り当てようとすると、同様のメソッド呼び出しとは異なるエラー メッセージが返されます。正しく実装されたクラス メンバーは、解釈しやすいエラー メッセージを返します。
以前、プロパティとメソッドの使用について混乱しました。しかし今、私はMSDN ガイドラインに従ってこのルールを使用しています:
メソッドはアクションを表し、プロパティはデータを表します。プロパティは、フィールドのように使用されることを意図しています。つまり、プロパティは、計算が複雑であったり、副作用を引き起こしたりしてはなりません。次のガイドラインに違反していない場合は、メソッドではなくプロパティを使用することを検討してください。