[解決済み] プロパティと変数の違いは何ですか?
質問
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違反
上記のような多くの理由から :)
もっと多くの理由があるかもしれません。
また、私が指摘したいのは ジェフ・アトウッドのブログ記事 を紹介し、その引用で締めくくりたい。
<ブロッククオートここで取り上げるべき本当に重要なことは、意味のないコードを書かないようにすることです。そして、パブリック変数の周りのプロパティラッパーは、まさに意味のないコードの本質です。
関連
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] AddTransient、AddScoped、AddSingleton サービスの相違点
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] キーワード「ref」と「out」の違いは何ですか?
-
[解決済み] C#では、public、private、protected、アクセス修飾子がないことの違いは何ですか?
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み] C# 3.0+におけるPropertyとFieldの相違点