如何知道我的对象在C#中有多少字节?

Aca*_*uza 3 .net c# struct

我正在构建一个应用程序,我需要在图表中处理一个位置.该位置具有X,Y的值以及北,东,南和纬的方向.我认为这个位置可能是Struct因为它代表该图中的单个值.

我研究并思考Structs并发现这些规则使用Struct:

  • 它逻辑上表示单个值,类似于基本类型(整数,双精度等).
  • 它的实例大小小于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
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何计算我的字节大小Struct以及如何知道它是否是不可变的?

谢谢.

更新:

好的.根据响应,似乎我Struct传递了16个字节,因为只有两个long有16个字节+ 1个字节CompassPoint.

但是一个额外的问题是:我获得的是使用Struct16字节和不可变的?看看DateTime Struct,它似乎有16个字节?任何问题?

Guf*_*ffa 6

大小取决于CompassPoint类型.但是,每个long将使用8个字节,因此您已经超过建议的最大16个字节.虽然这不是一个很难的规则,但是你可能会比一个班级更糟糕的表现,这取决于你如何使用它.

结构的确切大小由JIT编译器确定,但通常情况下,您可以添加成员的大小来预测大小.虽然小数据类型将被填充,因此如果您CompassPoint只使用一个字节,它仍然需要4或8个字节才能使结构大小达到均匀边界.

结构不是不可变的,因为您可以更改其中的属性.将setter设为私有,并添加一个可以创建它的构造函数,使其不可变:

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;
  }

}
Run Code Online (Sandbox Code Playgroud)