Marshall.SizeOf报告C#中结构数组的意外大小

本文关键字:意外 数组 结构 SizeOf 报告 Marshall | 更新日期: 2023-09-27 18:20:21

我不知道以前是否有人问过同样的问题。当我试图在网上搜索时,我找不到它。请帮我解决这个问题?

   using System;
   using System.Collections.Generic;
   using System.Linq;
   using System.Runtime.InteropServices;
   using System.Text;
   using System.Threading.Tasks;
   namespace ConsoleApplication1
   {
class Program
{
        [StructLayout(LayoutKind.Sequential)]
    public class Details
    {
        public uint ID;
        public uint state;
        public uint country;
        public uint place;
    }
    [StructLayout(LayoutKind.Sequential)]
    public class UserDetails
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst=8)]
        public Details[] userDetails;
    }
    static void Main(string[] args)
    {
        UserDetails u = new UserDetails();
        int sizeofDetails = Marshal.SizeOf(u);
    }
}
}

当我执行代码时,我期望细节的大小应该是128。但我已经64岁了。

数组的声明中有问题吗。有人能帮忙吗?

Marshall.SizeOf报告C#中结构数组的意外大小

class Details更改为struct Details(对UserDetails重复此操作)。随着这些变化,输出应该是预期的128。

在原始代码中,Details是一个Reference/Class类型,Details[]是一个由8个"references to"Detail实例组成的数组,而非是一个包含8个Detail结构值的数组。由于每个"引用"需要8个字节,这在64位平台上是有意义的,因此8x8=64(这是观察到的输出)。


我有点惊讶的是,即使类的有效目标,也没有对将StructLayout应用于类发出警告。也许是ReSharper添加的?我确信我在什么地方见过它。。