C# 如何计算结构实例的大小?

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;

这个问题只是为了满足我的兴趣。阅读页面时会说“它的实例大小小于16字节”

给定这个简单的不可变
结构

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谢谢您的链接,有趣的阅读:这是否意味着使用2
double
属性将不符合Microsoft指南,因为它们建议任何小于16字节的内容?严格来说,它不符合他们的指南,因为16不小于16。不过这是一个边缘案例。可能取决于您计划如何使用它们。