C# 如果我的结构没有';无法在COM互操作中执行?

C# 如果我的结构没有';无法在COM互操作中执行?,c#,clr,com+,struct,structlayout,C#,Clr,Com+,Struct,Structlayout,默认情况下,C#中的结构是通过[StructLayout(LayoutKind.Sequential)]实现的,原因基本上是这些类型的对象通常用于COM互操作,它们的字段必须按照定义的顺序。类定义了LayoutKind.Auto 我的问题是,我是否应该明确地将我的结构声明为[StructLayout(LayoutKind.Auto)],这会比默认的结构有什么好处?我的意思是,如果结构在堆栈上初始化,会有什么不同吗?即GC不必移动它们?当结构在堆上初始化时也会有帮助吗?也就是说,它是某个类的一部分

默认情况下,C#中的结构是通过
[StructLayout(LayoutKind.Sequential)]
实现的,原因基本上是这些类型的对象通常用于COM互操作,它们的字段必须按照定义的顺序。类定义了
LayoutKind.Auto


我的问题是,我是否应该明确地将我的结构声明为
[StructLayout(LayoutKind.Auto)]
,这会比默认的结构有什么好处?我的意思是,如果结构在堆栈上初始化,会有什么不同吗?即GC不必移动它们?当结构在堆上初始化时也会有帮助吗?也就是说,它是某个类的一部分?

我能想到的唯一可能的好处是结构占用更少的内存。但是,如果您首先有一个如此大的结构,那么您可能应该将它重构为一个类

一个潜在的问题是,如果您想使用
Marshal.PtrToStructure
struct
整理成
byte[]
,您如何保证字节的顺序符合预期


这样做似乎比你正在解决的问题更可能带来问题。。。也就是说,如果中字段的顺序对您来说并不重要,那么就这样做,但请记住,下一个单独来的人可能不会期待它。

它可能会给您带来好处,尽管我认为它不会起多大作用。我通常坚持默认值


基本上,通过自动布局,CLR可以选择如何对齐数据,因此可能需要在速度上进行一些空间权衡(这也取决于平台,在某些情况下保持数据对齐可能比在其他情况下更重要)。但是,由于结构也经常用于堆栈或复合辅助结构(想想KeyValuePair),sequential通常作为默认值使用。

Jeffrey Richter在其CLR via C#2中建议为封送方案(如COM互操作)中未使用的结构设置Layout.Auto。这就是我问这个问题的主要原因。我给出的示例不一定与COM互操作有关,它可能是某种形式的二进制序列化。