メンバー オブジェクトを .NET のプロパティまたはメソッドとして公開する

StackOverflow https://stackoverflow.com/questions/164527

質問

.NET では、クラスにクラス オブジェクトであるメンバーが含まれている場合、そのメンバーはプロパティとして公開されるべきですか、それともメソッドを使用して公開されるべきですか?

役に立ちましたか?

解決

現在のオブジェクトの状態に関連するオブジェクトインスタンスを公開するだけの場合は、プロパティを使用する必要があります。

メソッドは、メモリオブジェクトにアクセスしてその値を返す以上のことを行うロジックがある場合、または現在のオブジェクトの状態に広範な影響を与えるアクションを実行する場合に使用する必要があります。

他のヒント

オブジェクトの状態を概念的に表すすべてのプロパティを使用する必要があります。ただし、その取得が繰り返しの使用を避けなければならないほど高価な操作ではない限り、

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 ();
    }

それは問題とは無関係です。

値がオブジェクトの状態に関する詳細である場合、プロパティである必要があります。

オブジェクトに対して何らかのアクションを実行する場合は、Methodである必要があります。

プロパティ。プロパティは基本的に単なる「安い」メソッドです。オブジェクトへの参照の取得または設定は非常に安価です。

明確にするために、プロパティは通常、オブジェクトの内部状態を表すことになっています。ただし、プロパティまたはメソッドとしてのメンバーの実装は、呼び出しがどれほど高価になる可能性があるかをユーザーに伝えます。

プロパティが読み取り、クラス内のインスタンスに値を割り当てます。

メソッドは、クラスに割り当てられたデータを使用して何かを行います。

概要

一般に、プロパティは Name などのオブジェクトのデータを保存し、メソッドは Move Showなど、オブジェクトに実行を要求できるアクションです。クラスメンバがプロパティであり、メソッドであることが明らかでない場合があります-コレクションクラス(VB)の Item メソッドは、データを保存および取得し、インデックス付きプロパティとして実装できます。一方、 Item をメソッドとして実装することも合理的です。

構文

クラスメンバの使用方法は、プロパティとして表現するかメソッドとして表現するかを決定する要因にもなります。パラメーター化されたプロパティから情報を取得するための構文は、関数として実装されたメソッドに使用される構文とほとんど同じです。ただし、このような値を変更するための構文はわずかに異なります。

クラスのメンバーをプロパティとして実装する場合、この値を次のように変更する必要があります。

ThisObject.ThisProperty(Index)= NewValue

クラスメンバーがメソッドとして実装されている場合、変更される値は引数を使用して変更する必要があります。

ThisObject.ThisProperty(Index、NewValue)

エラー

値を読み取り専用プロパティに割り当てようとすると、メソッドの同様の呼び出しとは異なるエラーメッセージが返されます。正しく実装されたクラスメンバーは、解釈しやすいエラーメッセージを返します。

以前、プロパティとメソッドの使用について混乱しました。しかし、今私はこのルールに従って使用しています MSDN ガイドライン:

メソッドはアクションを表し、プロパティはデータを表します。プロパティはフィールドと同様に使用することを目的としています。つまり、プロパティは計算が複雑であったり、副作用が発生したりするべきではありません。次のガイドラインに違反しない場合は、経験の浅い開発者にとってプロパティの方が使いやすいため、メソッドではなくプロパティの使用を検討してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top