这两种结构有什么区别

Tyl*_*den 4 c# pinvoke layout structure

我可以通过两种方式定义这个结构,我希望将其作为参数传递给pinvoke函数.我想知道2之间有什么区别

[StructLayout(LayoutKind.Sequential)]
public struct Rect {
   public int left;
   public int top;
   public int right;
   public int bottom;
}   

[StructLayout(LayoutKind.Explicit)]
public struct Rect {
   [FieldOffset(0)] public int left;
   [FieldOffset(4)] public int top;
   [FieldOffset(8)] public int right;
   [FieldOffset(12)] public int bottom;
}
Run Code Online (Sandbox Code Playgroud)

根据我在这里找到的布局定义,内存中的内容看起来不一样吗?一个优于另一个的任何优势?

Ser*_*rvy 5

从我在这里找到的布局定义来看,内存中的内容不应该相同吗?

是的,它们在内存中看起来一样.

一个优于另一个的任何优势?

输入速度更快,更容易阅读.


使用FieldOffset当然是一种有用的工具; 它不像它总是无用的,但是如果你恰好用它来明确地在庄园中布置它们将在默认情况下布局的字段,那么它就没用了.如果您使用它来布置除默认值以外的庄园中的字段(例如,具有重叠,添加填充空间,使基础表示的顺序与声明顺序不同,等等),那么它就没用了.