如何知道我的对象在C#中有多少字节?
我正在构建一个应用程序,我需要处理图形中的位置。该位置的值为X、Y,方向为北、东、南和西。我认为这个位置可能是一个如何知道我的对象在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
结构
,因为它在该图中表示一个值
我研究并思考了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字节。它是可变的,因为您有publicset
访问器。不可变意味着在创建后无法更改属性。DateTime
struct只有8个字节。Kind
和Ticks
属性是其中唯一的实际数据,它们一起存储在long
中。关于16字节的建议:使用@AcazSouza:enum将使用一个字节,因此结构加上填充总共是20个字节。x64系统上可能有24个字节。感谢您的回复,但我还有一些问题。你能帮我吗?请看更新。另一个问题是为什么是20?2长=16+1字节=17 o.o.为什么是20?非托管字节?@AcazSouza:Structs被填充到一个偶数字边界,以便于访问内存。如果要将结构存储在奇数地址上,CPU将需要读取结构跨越的字,并移动数据。