C# 如何计算结构实例的大小?
这个问题只是为了满足我的兴趣。阅读页面时会说“它的实例大小小于16字节” 给定这个简单的不可变C# 如何计算结构实例的大小?,c#,struct,C#,Struct,这个问题只是为了满足我的兴趣。阅读页面时会说“它的实例大小小于16字节” 给定这个简单的不可变结构 public struct Coordinate { private readonly double _latitude; private readonly double _longitude; public Coordinate(double latitude, double longitude) { _latitude = latitude;
结构
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
使Microsoft提供的指南失败,因为double是8字节?两个double是16字节,正好是16字节,并且不小于16字节。您可以使用
System.Runtime.InteropServices.Marshal.SizeOf(new Coordinate());
返回16。你是对的-只有字段才算。可以添加属性而不增加大小 只有字段才算
在本例中,您有两个64位(8字节)字段;你只是在你的启发范围之内
请注意,如果您使用any,那么编译器将创建“隐藏”字段来支持这些属性,因此您的总体总和也应该考虑这些属性
例如,此结构还需要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; }
}
您可以使用
sizeof(Coordinate)
进行编程计算,尽管这需要不安全的上下文。在您的情况下,大小是16字节,如您所说。属性不计入大小,因为它们只是包装器。结构的大小只是其所有字段大小之和。首先,要确定结构的大小,请使用Marshal.SizeOf(struct)
,它返回其成员大小之和。Microsoft确实建议使用结构的大小,但这实际上取决于您。有一些与结构相关的开销。如果您的结构将引用类型作为成员,请确保不包括引用类型实例的大小,而只包括引用的大小 该指南的可能重复之处在于是否使用struct
有点误导。出于语义方面的原因,您应该选择是否使用struct
。技术方面的原因虽然可以,但只有当您从出于语义原因所做的选择中发现性能问题时,才应该考虑。@gcso谢谢您的链接,有趣的阅读:这是否意味着使用2double
属性将不符合Microsoft指南,因为它们建议任何小于16字节的内容?严格来说,它不符合他们的指南,因为16不小于16。不过这是一个边缘案例。可能取决于您计划如何使用它们。