3

クラスよりも構造体の方が望ましい場合があります。

  • 3つのboolが含まれています
  • 不変です
  • 箱詰めされることはありません

ただし、アクセスのみのプロパティをいくつか追加して、上記の3つのブールの組み合わせを提供したいと思います。たとえば、boolは「同じ」、「進む」、「戻る」です。プロパティは、「All」、「None」、「UniDirectional」、「BiDirectional」などで、前者の3から決定できます。

これらのプロパティにより、スタック上の構造体の各インスタンスのサイズが大きくなり、クラスがより適切になりますか?それとも選択に影響しませんか?

4

1 に答える 1

8

短い答え:

いいえそうではありません。

長い答え:

いいえそうではありません; しかし...

プロパティ自体は単なる通常のメソッドですが、フィールドのような構文に身を包んでいます。メソッドはメモリ内の1つの場所にのみ存在するため(そのタイプのすべてのオブジェクトで同じであるため)、各インスタンスのサイズには影響しません。新しい仮想メソッドを追加するとvtableのサイズが大きくなるため、仮想メソッド(仮想プロパティを含む)はこれを少し混乱させることに注意してください。ただし、vtableはクラスごとに1回しか存在しません。しかし、構造体には.NETにvtablesがないため(C ++ではありますが、構造体とクラスは意味的に同一であるため)、これは重要ではありません。

「プロパティ」は構造体タイプのメモリサイズを増やすことができますが、それを書いた人が「自動プロパティ」に慣れていない場合に限ります。C#3.0では、自動的に実装されるプロパティ(または略して「自動プロパティ」)が導入されました。このプロパティでは、コンパイラによって、簡単なゲッター/セッタープロパティ用の非表示フィールドが作成されます。構文はpublic PropertyName { get; set; }です。

unionトピックに戻る:カスタムStructLayout( C#でsを作成する方法)を使用するときに重複するフィールドがない限り、インスタンスメンバーフィールドのみが構造体のサイズに影響します。静的メンバーはインスタンスのサイズに影響を与えないことに注意してください。ただし、VBでは、Staticキーワードをローカル変数に使用すると、インスタンスのサイズに影響を与える可能性があります(同じ単語「静的」にもかかわらず、StaticVBでマークされたローカル変数は静的クラスにありません)州)。

最後に、.NETには値に関連するオーバーヘッドがありますが、これらは.NETの「管理」の性質に固有のものですが、相互運用シナリオで使用される構造体には適用されません(つまり、ポインター演算とsizeofすべてが同じように機能します)。 C / C ++の下で)。

于 2012-08-22T01:02:38.183 に答える