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岁了。
数组的声明中有问题吗。有人能帮忙吗?
将class Details
更改为struct Details
(对UserDetails重复此操作)。随着这些变化,输出应该是预期的128。
在原始代码中,Details是一个Reference/Class类型,Details[]
是一个由8个"references to"Detail实例组成的数组,而非是一个包含8个Detail结构值的数组。由于每个"引用"需要8个字节,这在64位平台上是有意义的,因此8x8=64(这是观察到的输出)。
我有点惊讶的是,即使类是的有效目标,也没有对将StructLayout应用于类发出警告。也许是ReSharper添加的?我确信我在什么地方见过它。。