【问题标题】:How I can declare arrays in struct?如何在结构中声明数组?
【发布时间】:2010-11-08 11:16:44
【问题描述】:

如何声明具有固定大小数组的结构?

我找到了解决方案,但它只适用于原始数据类型。我需要我的数组类型为MyStruct

那么如何声明一个包含其他结构数组的结构呢?

例如

    unsafe struct Struct1{
      fixed int arrayInt[100]; // works properly 
      fixed Struct2 arrayStruct[100]; //not compile
    }

【问题讨论】:

    标签: c# interop


    【解决方案1】:

    我的同事找到了执行此操作的工作方法。我认为这是正确的方式。

        [StructLayout(LayoutKind.Sequential)]
         public struct Struct1
         {
               [MarshalAs(UnmanagedType.ByValArray, SizeConst = sizeOfarray)]
               private Struct2[] arrayStruct;
         }
    

    【讨论】:

      【解决方案2】:

      你不能。固定数组仅限于 bool、byte、char、short、int、long、sbyte、ushort、uint、ulong、float 或 double。

      http://msdn.microsoft.com/en-us/library/zycewsya%28v=VS.80%29.aspx

      进行互操作的一种方法可能是在 C++ 中编写一个包装程序集,该程序集将转换为对 C# 更友好的结构。

      【讨论】:

      • 有谁知道为什么只允许原始类型,而不是每个 blittable 类型都被允许?
      • 只是猜测:如果您允许问题中的构造,则每个 Struct2 实例的所有成员也必须隐式修复。因此,通过几级嵌套,您可以在所有地方固定项目,这会让垃圾收集器非常头疼。
      【解决方案3】:

      您不能对固定数组使用自定义类型。 (有关详细信息,请参阅 TTonis 答案。)

      我认为您应该使用MarshalAs 属性来指定应如何编组成员,而不是尝试在 C# 中构造具有特定内存布局的结构。即使您设法获得占用适当内存量的成员,您仍然有元素之间的填充会导致对齐问题。

      你可以在结构中引用一个常规数组,并指定它应该被编组为ByValArray

      【讨论】:

        猜你喜欢
        • 2021-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        • 2020-11-09
        • 2013-06-19
        • 2018-05-13
        相关资源
        最近更新 更多