1. ホーム
  2. c#

[解決済み] プロパティと変数の違いは何ですか?

2023-04-30 11:23:16

質問

PropertyとVariablesの理解で迷っています。

public class ABC()
{
    public int A;
    public int B { get; set; }
}

AとBの正確な違いは何ですか?

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

多くの方が指摘されているように、Aは フィールド であり、Bは プロパティ .

本当の問題は、なぜ気にする必要があるのか、そして何を使うべきなのか、ということです。

私が参照しているのは Jonathan Anejaのブログ記事 :

(VBで書かれていますが、C#にも当てはまります;))

では、なぜフィールドではなくプロパティを使うのか、その5つの理由を説明します。

<ブロッククオート

1. インターフェイスでフィールドを使用することはできません。

オブジェクトのパブリックコントラクトの中で、フィールドの存在を強制することはできません。 オブジェクトのパブリックコントラクトに フィールドの存在を強制することはできません。プロパティの場合 では問題なく動作しますが。

2. バリデーション

現在、あなたのアプリケーションでは 特定の値を設定するためにバリデーションロジックを必要としない 特定の値を設定するための検証ロジックは必要ないかもしれませんが ビジネス要件の変化により このロジックを後で挿入する必要があるかもしれません。その場合 フィールドをプロパティに変更することは に変更することは、APIの利用者にとって破格の変更となります。 その時点で、フィールドをプロパティに変更することは、APIを使う側にとって破壊的な変更となります。(例えば、誰かがリフレクションであなたのクラスを調査していた場合) リフレクションによってクラスを検査する場合など)。

3. バイナリー・シリアライズ

フィールドをプロパティに変更することは バイナリシリアライズを使用している場合 を使用している場合、フィールドをプロパティに変更することは破壊的な変更です。ちなみに、これは VB10 の 自動実装されたプロパティが 「バインド可能な(bindable)バッキング・フィールドを持つのはこのためです。 バッキングフィールドの名前をコードで表現できる そうすれば、自動実装のプロパティを 自動実装のプロパティを 自動実装プロパティを拡張プロパティに変更しても シリアライズの互換性を維持する バッキングフィールドの名前を同じにすることで、シリアライズの互換性を保つことができます。 C#ではバッキング・フィールドが生成されるため、バッキング・フィールド名を変更せざるを得ません。 C#ではバッキングフィールドを を生成するため、変更せざるを得ません)。

4. .NET データバインディング インフラストラクチャの多くは、プロパティにバインドしますが、フィールドにはバインドしません。

私は、それが良いことかどうか それが良いことであるかどうかについては、賛否両論を耳にしました。 しかし、現実には、それが現在の方法です。 ということです。 (私からの注記: WPF バインディングはプロパティで動作します)

5. パブリックフィールドを公開することは FxCop違反

上記のような多くの理由から :)

もっと多くの理由があるかもしれません。

また、私が指摘したいのは ジェフ・アトウッドのブログ記事 を紹介し、その引用で締めくくりたい。

<ブロッククオート

ここで取り上げるべき本当に重要なことは、意味のないコードを書かないようにすることです。そして、パブリック変数の周りのプロパティラッパーは、まさに意味のないコードの本質です。