独自のフィールドとプロパティでクラス内で作業する場合、通常、プロパティを使用するのは、何らかの機能 (値の制限や検証など) を実行するときだけです。それ以外の場合は、バッキング フィールドを直接読み書きすることを好みます。
私はどういうわけか、これが物事を行うためのより一般的にパフォーマンスの高い方法であると頭に浮かびましたが、この考えを裏付ける証拠が実際には何もないことに気づきました。
慣習や好みは別として、一方の方法と他方の方法の間に実際のパフォーマンス要因はありますか?
独自のフィールドとプロパティでクラス内で作業する場合、通常、プロパティを使用するのは、何らかの機能 (値の制限や検証など) を実行するときだけです。それ以外の場合は、バッキング フィールドを直接読み書きすることを好みます。
私はどういうわけか、これが物事を行うためのより一般的にパフォーマンスの高い方法であると頭に浮かびましたが、この考えを裏付ける証拠が実際には何もないことに気づきました。
慣習や好みは別として、一方の方法と他方の方法の間に実際のパフォーマンス要因はありますか?
プロパティが単純な get/set である場合、コンパイルされます。つまり、コンパイラは、プロパティまたはフィールドを直接使用して同じものに変換するため、パフォーマンスの違いはありません。
ただし、get/set は任意のロジックを組み込むことができるため、コストがかかる可能性があります。ただし、ガイドラインでは、多くの場合、それらを軽く保つように勧められています。
プロパティには、get/set カバーだけであっても、いくつかの利点があります。
余談ですが、これらの細かいパフォーマンス特性を確認するのは興味深いことですが、このタイプの最適化を適用する製品コード (この場合は最適化はありません) は、時期尚早の最適化の旗の下にある可能性があります。
それは本当に依存します。技術的には遅くなる可能性がありますが、その場合でもほとんど感知できません。メソッドのインライン化がどのように機能するかのルールは、hereから取得したものです。
C# コンパイラは、プロパティ宣言から個別のゲッター メソッドとセッター メソッドを作成するため、それらは互いに独立して処理されることは明らかです。上記のルールに基づくと、ほとんどの場合、プロパティ アクセサーはインライン化されていると言えます。メソッドが非仮想でなければならないというルールは、頻繁に発生する重要なショーストッパーの 1 つになると思います。
性能に違いはないはずです。Reflectorを使用してコードの逆アセンブリを確認すると、最も簡単な方法でバッキング フィールドが自動的に作成されます。実際には、コンパイラーが提供する構文糖衣に過ぎず、生活を楽にします。
クラスまたは構造体が構造体型の可変フィールドを公開している場合、全体をコピーしなくても、その構造体の個々のフィールドにアクセスできます。対照的に、プロパティ (変更可能かどうかに関係なく)、または「読み取り専用」フィールドを公開する場合、構造体の任意の部分にアクセスすると、システムは構造体全体をコピーしてからそのコピーにアクセスします。さらに、消費者コードは、冗長なコピー操作なしで、公開された構造体フィールドのフィールドを便利かつ効率的に変更できます。対照的に、構造体がプロパティとして公開されている場合、その一部を変更するには、消費者がそれを一時変数にコピーし、変更を加えてから保存する必要があります。一連の手順により、構造全体が失われる可能性があります。 4 回コピーすること (読み取り時にサプライヤーと消費者がそれぞれ 1 回、