这个问题只是为了满足我的兴趣。阅读页面Choosing Between Classes and Structures说“它的实例大小小于16个字节。”。
鉴于这个简单的不可变struct
。
public struct Coordinate
{
private readonly double _latitude;
private readonly double _longitude;
public Coordinate(double latitude, double longitude)
{
_latitude = latitude;
_longitude = longitude;
}
public double Latitude
{
get { return _latitude; }
}
public double Longitude
{
get { return _longitude; }
}
}
属性是否也计入16字节限制?或者只做场数?
如果后者不使用struct
失败了微软提供的指南,因为双倍是8字节?两个双精度数为16个字节,正好是16个字节而不是更少。
答案 0 :(得分:4)
只是字段数。
所以在这种情况下你有两个64位(8字节)字段;你只是在启发式的范围内。
请注意,如果您使用任何auto-implemented properties,那么编译器将创建“隐藏”字段来支持这些属性,因此您的总和也应考虑到这些。
例如,此结构也需要16个字节:
public struct Coordinate
{
public Coordinate(double latitude, double longitude) : this()
{
Latitude = latitude;
Longitude = longitude;
}
public double Latitude { get; private set; }
public double Longitude { get; private set; }
}
答案 1 :(得分:2)
首先,要确定结构的大小,请使用Marshal.SizeOf(struct)
返回其成员大小的总和。 Microsoft确实建议结构be below 16 bytes的大小,但它真的取决于你。结构有一些开销。如果您的struct具有引用类型作为成员,请确保不包括引用类型实例的大小,只包括引用的大小。
答案 2 :(得分:1)
您可以使用
找出尺寸System.Runtime.InteropServices.Marshal.SizeOf(new Coordinate());
返回16.你是对的 - 只有字段数。您可以在不增加大小的情况下添加属性。
答案 3 :(得分:1)
您可以使用sizeof( Coordinate )
来计算它,但这需要不安全的上下文。在你的情况下,大小是16字节,如你所说。属性不计入大小,因为它们只是包装器。结构的大小只是其所有字段大小的总和。