3

アプリを構築していて、グラフ内の位置を処理する必要があります。この位置には、X、Y の値と、北、東、南、西などの方向があります。Structこの位置は、そのグラフの単一の値を表すため、可能性があると思います。

私は調査し、考え、Structsこれらのルールを使用して見つけましたStruct

  • プリミティブ型 (integer、double など) と同様に、単一の値を論理的に表します。
  • インスタンス サイズは 16 バイト未満です。
  • 不変です。
  • 頻繁に箱詰めする必要はありません。

これが私の未完成の例ですStruct

public struct Position
{
   public long PositionX { get; set; }

   public long PositionY { get; set; }

   public CompassPoint CompassPoint { get; set; }
}

public enum CompassPoint : byte
{
   North,
   East,
   South,
   West
}

私のサイズをバイト単位で計算するStruct方法と、それが不変であるかどうかを知る方法を知りたいですか?

ありがとう。

アップデート:

わかった。応答によると、Struct16longバイト+ CompassPoint.

しかし、追加の質問は次のとおりですStruct。16バイトで不変のを使用して得たものは何ですか? を見DateTime Structてください。16 バイト以上あるように見えますか? 何の問題?

4

2 に答える 2

6

サイズはCompassPoint種類によって異なります。ただし、それぞれlongが 8 バイトを使用するため、推奨される最大値の 16 バイトをすでに超えています。厳密なルールではありませんが、使い方によってはクラスよりもパフォーマンスが低下する場合があります。

構造体の正確なサイズは JIT コンパイラによって決定されますが、ジャンル的にはメンバーのサイズを追加するだけでサイズを予測できます。ただし、小さなデータ型はパディングされるためCompassPoint、1 バイトだけを使用する場合でも、構造体のサイズを偶数の境界に到達させるには 4 または 8 バイトが必要です。

プロパティを変更できるため、構造体は不変ではありません。セッターを非公開にし、それを作成して不変にするコンストラクターを追加します。

public struct Position {

  public long PositionX { get; private set; }
  public long PositionY { get; private set; }
  public CompassPoint CompassPoint { get; private set; }

  public Position(long x, long y, CompassPoint compass) {
    PositionX = x;
    PositionY = y;
    CompassPoint = compass;
  }

}
于 2012-08-29T00:49:48.797 に答える
2

Marshal.SizeOfメソッドを使用して、構造体の管理されていないサイズ(バイト単位)を取得できます。

Position pos = new Position(); // this constructor call is not necessary for structs
int sizeInBytes = Marshal.SizeOf(pos);

ただし、オブジェクトの管理されていないサイズと管理されているサイズは異なる場合があることに注意してください。

于 2012-08-29T01:02:02.383 に答える