2

独自のフィールドとプロパティでクラス内で作業する場合、通常、プロパティを使用するのは、何らかの機能 (値の制限や検証など) を実行するときだけです。それ以外の場合は、バッキング フィールドを直接読み書きすることを好みます。

私はどういうわけか、これが物事を行うためのより一般的にパフォーマンスの高い方法であると頭に浮かびましたが、この考えを裏付ける証拠が実際には何もないことに気づきました。

慣習や好みは別として、一方の方法と他方の方法の間に実際のパフォーマンス要因はありますか?

4

4 に答える 4

3

プロパティが単純な get/set である場合、コンパイルされます。つまり、コンパイラは、プロパティまたはフィールドを直接使用して同じものに変換するため、パフォーマンスの違いはありません。

ただし、get/set は任意のロジックを組み込むことができるため、コストがかかる可能性があります。ただし、ガイドラインでは、多くの場合、それらを軽く保つように勧められています。

プロパティには、get/set カバーだけであっても、いくつかの利点があります。

  • データ バインディングでは、フィールドではなく、プロパティのみを表示できます。
  • カプセル化の概念を維持します。
  • 読み取り専用または書き込み専用のセマンティクスを適用できます。
  • 基になるフィールドに属性を個別に適用できます (シリアル化のシナリオで役立ちます)。

余談ですが、これらの細かいパフォーマンス特性を確認するのは興味深いことですが、このタイプの最適化を適用する製品コード (この場合は最適化はありません) は、時期尚早の最適化の旗の下にある可能性があります。

于 2010-07-02T15:41:14.400 に答える
3

それは本当に依存します。技術的には遅くなる可能性がありますが、その場合でもほとんど感知できません。メソッドのインライン化がどのように機能するかのルールは、hereから取得したものです。

  • IL の 32 バイトを超えるメソッドはインライン化されません。
  • 仮想関数はインライン化されません。
  • 複雑なフロー制御を持つメソッドはインライン化されません。複雑なフロー制御は、if/then/else 以外のフロー制御です。この場合は、switch または while です。
  • 例外処理ブロックを含むメソッドはインライン化されませんが、例外をスローするメソッドは依然としてインライン化の候補です。
  • メソッドの仮引数のいずれかが構造体である場合、メソッドはインライン化されません。

C# コンパイラは、プロパティ宣言から個別のゲッター メソッドとセッター メソッドを作成するため、それらは互いに独立して処理されることは明らかです。上記のルールに基づくと、ほとんどの場合、プロパティ アクセサーはインライン化されていると言えます。メソッドが非仮想でなければならないというルールは、頻繁に発生する重要なショーストッパーの 1 つになると思います。

于 2010-07-02T15:51:41.240 に答える
1

性能に違いはないはずです。Reflectorを使用してコードの逆アセンブリを確認すると、最も簡単な方法でバッキング フィールドが自動的に作成されます。実際には、コンパイラーが提供する構文糖衣に過ぎず、生活を楽にします。

于 2010-07-02T15:41:19.953 に答える
1

クラスまたは構造体が構造体型の可変フィールドを公開している場合、全体をコピーしなくても、その構造体の個々のフィールドにアクセスできます。対照的に、プロパティ (変更可能かどうかに関係なく)、または「読み取り専用」フィールドを公開する場合、構造体の任意の部分にアクセスすると、システムは構造体全体をコピーしてからそのコピーにアクセスします。さらに、消費者コードは、冗長なコピー操作なしで、公開された構造体フィールドのフィールドを便利かつ効率的に変更できます。対照的に、構造体がプロパティとして公開されている場合、その一部を変更するには、消費者がそれを一時変数にコピーし、変更を加えてから保存する必要があります。一連の手順により、構造全体が失われる可能性があります。 4 回コピーすること (読み取り時にサプライヤーと消費者がそれぞれ 1 回、

于 2012-07-31T20:21:02.493 に答える