c# – 如果它们不在COM Interop中执行,我会使用LayoutKind.Auto作为我的结构体?

默认情况下,C#中的结构是使用[StructLayout(LayoutKind.Sequential)]实现的,原因基本上是说这些类型的对象通常用于COM Interop,并且它们的字段必须保持其定义的顺序.类已定义LayoutKind.Auto.

我的问题是我应该明确地将我的结构声明为[StructLayout(LayoutKind.Auto)]并且这会给我带来超过默认值的任何好处吗?我的意思是如果结构在堆栈上初始化,它会有什么不同 – 即GC不必移动它们吗?结构在堆上初始化时也会有所帮助 – 也就是某些类的一部分?

解决方法:

我能想到的唯一可能的好处是你的结构占用更少的内存.但是如果你首先有这么大的结构,你应该把它重构成一个类.

一个潜在的问题是你想使用Marshal.PtrToStructure将你的结构转换为byte [],你如何保证字节的顺序将如你所愿?

这样做似乎就是你引入了比你正在解决的问题更多的可能问题……如果对你来说这些领域的顺序对你来说永远不重要,那就去做吧,但要记住下一个来的人可能没有人期待它.

上一篇:windows异步通知I/O模型


下一篇:c# – 如何在任何基于CLR的语言程序集中找到给定类型的所有类型依赖?