web-dev-qa-db-ja.com

読み取り専用プロパティまたはメソッドを使用するには?

クラスのインスタンスの "is mapped?"状態を公開する必要があります。結果は、基本的なチェックによって決定されます。それは単にフィールドの値を公開するではありません。読み取り専用のプロパティとメソッドのどちらを使用するべきかわかりません。

読み取り専用プロパティ:

public bool IsMapped
{
    get
    {
        return MappedField != null;
    }
}

方法:

public bool IsMapped()
{
    return MappedField != null;
}

MSDNの プロパティとメソッドの選択 を読みましたが、まだわかりません。

68
Dave New

C#標準は言う

§8.7.4

propertyは、オブジェクトまたはクラスの特性へのアクセスを提供するメンバーです。プロパティの例には、文字列の長さ、フォントのサイズ、ウィンドウのキャプション、顧客の名前などがあります。プロパティはフィールドの自然な拡張です。どちらも型が関連付けられた名前付きメンバーであり、フィールドとプロパティにアクセスするための構文は同じです。ただし、フィールドとは異なり、プロパティは格納場所を示しません。代わりに、プロパティには、値の読み取りまたは書き込み時に実行されるステートメントを指定するアクセサーがあります。

一方、メソッドは次のように定義されています

§8.7.3

メソッドは、オブジェクトまたはクラスが実行できる計算またはアクションを実装するメンバーです。メソッドには、(おそらく空の)仮パラメーターのリスト、戻り値(メソッドのreturn-typeがvoidでない場合)があり、静的または非静的のいずれかです。

Propertiesおよびmethodsを使用して encapsulation を実現します=。プロパティはデータをカプセル化し、メソッドはロジックをカプセル化します。そして、これが、データを公開する場合に読み取り専用プロパティを好む理由です。あなたの場合、オブジェクトの内部状態を変更するロジックはありません。 オブジェクトの特性へのアクセスを提供したい

オブジェクトのインスタンスIsMappedであるかどうかは、オブジェクトの特性です。これにはチェックが含まれていますが、それにアクセスするためのプロパティがあります。プロパティはロジックを使用して定義できますが、ロジックを公開しないでください。最初の引用で述べた例のように、String.Lengthプロパティを想像してみてください。実装によっては、このプロパティが文字列をループして文字を数える場合があります。また、操作も実行しますが、「外部から」オブジェクトの内部状態/特性に関するステートメントを提供します。

85
Carsten

本当の「行う」(アクション)がなく、副作用がなく、複雑すぎないので、このプロパティを使用します。

21
Micha

個人的には、methodが何かをしたり、何らかのアクションを実行したりする必要があると思います。 IsMapped内では何も実行していないため、propertyである必要があります

11
Haris Hasan

私は物件に行きます。主に、参照されているMSDN記事の最初の意味が原因です。

一般に、メソッドはアクションを表し、プロパティはデータを表します。

7
venerik

この場合、それがプロパティである必要があることは私にはかなり明確に思えます。これは単純なチェックであり、ロジック、副作用、パフォーマンスへの影響はありません。そのチェックほど簡単にはなりません。

編集:

上記のいずれかがだった場合をメソッドに入れる場合、そのメソッドには補助動詞ではなく強力な動詞を含める必要があることに注意してくださいのようなものです。メソッドは何かを行います。動詞で始まる限り、VerifyMapping、DetermineMappingExistance、またはその他の名前を付けることができます。

4
nvoigt

あなたのリンクのこの行が答えだと思います

メソッドはアクションを表し、プロパティはデータを表します。

ここではアクションはなく、データの一部です。つまり、プロパティです。

4
James

値を取得するためにパラメータを追加する必要がある場合は、メソッドが必要です。それ以外の場合は、プロパティが必要です

3
Odys

これはデータを取得するものであり、副作用がないため、プロパティである必要があると言って、ここの人々に同意します。

さらに詳しく言えば、「外部から見た」誰かに副作用が理にかなっている場合は、セッターを使用した副作用(ゲッターではない)も受け入れます。

これについて考える1つの方法は、メソッドは動詞であり、プロパティは形容詞であるということです(一方、オブジェクト自体は名詞であり、静的オブジェクトは抽象名詞です)。

動詞/形容詞のガイドラインの唯一の例外は、問題の情報を取得(または設定)するときに、プロパティではなくメソッドを使用することが理にかなっている可能性があることです。論理的には、このような機能はおそらくプロパティであるはずですが、しかし、人々はプロパティをパフォーマンスの影響が少ないと考えることに慣れており、それが常に当てはまる本当の理由はありませんが、GetIsMapped()はパフォーマンスが比較的高いことを強調することは有用です。それは実際にありました。

実行中のコードのレベルでは、プロパティを呼び出すことと、取得または設定する同等のメソッドを呼び出すこととの間にまったく違いはありません。それは、それを使用するコードを書いている人にとって、生活を楽にするためのものです。

2
Jon Hanna

IMHO、最初の読み取り専用プロパティは正しいです。これは、IsMappedがオブジェクトの属性であり、アクションを実行していない(評価のみ)ためですが、結局のところ、既存のコードベースとの一貫性は、セマンティクス....これがユニ割り当てでない限り

2
Casey

これらの構造の両方にアクセスできる状況/言語では、一般的な分割は次のようになります。

  • リクエストがオブジェクトに対して何かである場合hasの場合、プロパティ(またはフィールド)を使用します。
  • リクエストがオブジェクトdoesの結果である場合は、メソッドを使用します。

もう少し具体的には、プロパティは、プロパティを公開するオブジェクトが所有する(使用目的で)データメンバーに、読み取りおよび/または書き込みの方法でアクセスするために使用されます。プロパティはフィールドよりも優れています。なぜなら、データは常に永続的な形式で存在する必要がないため(このデータ値の計算や取得について「怠惰」になることができるため)、この目的のためのメソッドよりも優れているからです。それらをパブリックフィールドであるかのようにコードで使用できます。

ただし、プロパティによって副作用が発生することはありません(返される値を永続化することを目的とした変数の設定の可能性があり、理解可能な例外があり、何度も必要となる高価な再計算を回避します)。それらは、他のすべての条件が等しい場合、確定的な結果を返す必要があるため(NextRandomNumberはプロパティの概念的な選択として不適切です)、他の計算に影響を与える状態データの変更(たとえば、PropertyAの取得やその順序でのPropertyBは、PropertyBを取得してからPropertyAを取得する場合と異なる結果を返しません。

メソッドOTOHは概念的には、何らかの操作を実行して結果を返すものとして理解されています。つまり、戻り値の計算の範囲を超える可能性がある何かを実行します。したがって、メソッドは、値を返す操作に追加の副作用がある場合に使用されます。戻り値はまだ何らかの計算の結果である可能性がありますが、メソッドがそれを非決定的に計算した可能性があります(GetNextRandomNumber())、または返されたデータがオブジェクトの一意のインスタンスの形式であり、メソッドを再度呼び出すと、同じデータ(GetCurrentStatus())が含まれている場合でも、別のインスタンスである場合、またはメソッドが状態データを変更して、まったく同じことを2回続けて行うと異なる結果(EncryptDataBlock();になる場合があります)。同じデータを2回続けて暗号化すると、異なる暗号文が生成されるように設計されています)。

2
KeithS

プロパティはフィールドの詳細を返すだけなので、プロパティを期待します。一方、私は期待します

MappedFields[] mf;
public bool IsMapped()
{
     mf.All(x => x != null);
}
1
Sayse

この理由でc#にはプロパティがあるため、このプロパティを使用する必要があります

0
MjeOsX