在仅包含值类型的自定义结构上使用Marshal.SizeOf()方法

时间:2012-02-10 00:19:03

标签: c# .net

我创建了一个简单的结构,它由两个值类型组成。

public struct Identifier
{
    public Guid ID { get; set; }
    public Byte RequestType { get; set; }
}

然后我使用以下语句在自定义结构Marshal.SizeOf()上调用Identifier方法。

Identifier i = new Identifier();
Console.WriteLine(Marshal.SizeOf(i));   // output: 20
Console.WriteLine(Marshal.SizeOf(i.GetType()));   // output: 20

Marshal.SizeOf()为什么不返回17? 以下指示信息显示Guid对象为16个字节,字节object为1个字节。

Guid g = Guid.NewGuid();
Console.WriteLine(Marshal.SizeOf(g));   // output: 16
Console.WriteLine(Marshal.SizeOf(g.GetType()));   // output: 16

Byte t = 0;
Console.WriteLine(Marshal.SizeOf(t));   // output: 1
Console.WriteLine(Marshal.SizeOf(t.GetType()));   // output: 1

2 个答案:

答案 0 :(得分:6)

默认情况下,CLR可以重新排列(对于简单的结构,它永远不会这样),并且可以随意填充结构。这通常是为了在内存中使其与字边界对齐。

如果您不喜欢此行为并想要更改它,则可以按如下方式指定不打包:

[StructLayout(LayoutKind.Sequential,Pack=1)]

答案 1 :(得分:3)

出于对齐原因,当复制到非托管内存时,Identifier结构填充3个字节。