1. ホーム
  2. c#

読み取り専用のプロパティとメソッドのどちらを使用するか?

2023-09-24 18:50:58

質問

私は " を公開する必要があります。 はマップされていますか? "クラスのインスタンスの状態を公開する必要があります。 結果は基本的なチェックで決定されます。それは ではない 単にフィールドの値を公開しているだけです。 読み取り専用のプロパティを使うべきか、メソッドを使うべきか、迷っています。

読み取り専用のプロパティです。

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

メソッドです。

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

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

どのように解決するのですか?

C#の規格では

§ 8.7.4

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

と定義されているのに対し、メソッドは

§ 8.7.3

A メソッド は、オブジェクトまたはクラスによって実行される計算またはアクションを実装するメンバです。メソッドには正式なパラメータのリスト(空の場合もある)、戻り値(メソッドの戻り値が void でない限り)があり、静的または非静的のどちらかです。

プロパティ メソッド を実現するために使用されます。 カプセル化 . プロパティはデータをカプセル化し、メソッドはロジックをカプセル化します。そして、データを公開する場合は、読み取り専用のプロパティを選択する必要があるのは、このためです。あなたのケースでは、オブジェクトの内部状態を変更するロジックはありません。あなたは オブジェクトの特性へのアクセスを提供する .

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