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

如何知道我的对象在C#中有多少字节?,c#,.net,struct,C#,.net,Struct,我正在构建一个应用程序,我需要处理图形中的位置。该位置的值为X、Y,方向为北、东、南和西。我认为这个位置可能是一个结构,因为它在该图中表示一个值 我研究并思考了Structs,找到了使用Struct的规则: public struct Position { public long PositionX { get; set; } public long PositionY { get; set; } public CompassPoint CompassPoint { get

我正在构建一个应用程序,我需要处理图形中的位置。该位置的值为X、Y,方向为北、东、南和西。我认为这个位置可能是一个
结构
,因为它在该图中表示一个值

我研究并思考了
Structs
,找到了使用
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
}
  • 它在逻辑上表示单个值,类似于基元类型 (整数、双精度等)
  • 它的实例大小小于16字节
  • 它是不变的
  • 它不必经常装箱
下面是我未完成的
结构的一个示例:

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
的字节大小,以及如何知道它是否是不可变的

谢谢

更新:

好的。根据回答,我的
Struct
似乎通过了16个字节,因为只有两个
long
具有16个字节+1个字节的
CompassPoint


但另一个问题是:我用一个16字节且不可变的
Struct
得到了什么?再看看
DateTime
Struct
,它似乎有更多的16字节?有问题吗?

大小取决于
CompassPoint
类型。但是,每个
long
将使用8个字节,因此您已经超过了建议的最大16个字节。虽然这不是一条硬性规定,但您可能会得到比类更差的性能,这取决于您如何使用它

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

结构不是不可变的,因为您可以更改其中的属性。将setter设置为私有,并添加一个可以创建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;
  }

}
可以使用获取结构的非托管大小(以字节为单位):

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

但是请注意,对象的非托管和托管大小有时可能会有所不同。

不是每个都长8字节,如果您真的有两个长字节和其他内容,那么这里的长度似乎会超过16字节。它是可变的,因为您有public
set
访问器。不可变意味着在创建后无法更改属性。
DateTime
struct只有8个字节。
Kind
Ticks
属性是其中唯一的实际数据,它们一起存储在
long
中。关于16字节的建议:使用@AcazSouza:enum将使用一个字节,因此结构加上填充总共是20个字节。x64系统上可能有24个字节。感谢您的回复,但我还有一些问题。你能帮我吗?请看更新。另一个问题是为什么是20?2长=16+1字节=17 o.o.为什么是20?非托管字节?@AcazSouza:Structs被填充到一个偶数字边界,以便于访问内存。如果要将结构存储在奇数地址上,CPU将需要读取结构跨越的字,并移动数据。