【问题标题】:Using array created in struct使用在结构中创建的数组
【发布时间】:2016-02-05 12:21:32
【问题描述】:

我正在尝试在我的 C# 应用程序中使用 C++ 代码。创建了以下结构:

System.Runtime.InteropServices.StructLayout(
                        System.Runtime.InteropServices.LayoutKind.Sequential)]

public struct My_FSet
{
    public int Num;
    [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 100)]
    public uint[] Freqs;
}

我想在我的代码中像数组一样使用它,比如

My_FSet FSet = new My_FSet();
FSet.Freqs[0] = 1000;
FSet.Freqs[1] = 2500;
FSet.Freqs[3] = 3200;

但我得到一个错误:

MyApp.exe 中出现“System.NullReferenceException”类型的未处理异常

附加信息:对象引用未设置为对象的实例。

似乎数组没有正确初始化,但我不能在结构中这样做,那么我该如何解决这个问题?

【问题讨论】:

  • 使用struct的构造函数初始化数组
  • @Ehsan Sajjad。你能扩展一下吗?
  • @Patrick Hoffman。我恭敬地不同于这是一个重复问题的概念。我知道空引用并且通常理解它们足以相处。然而,这里的问题是,数组是在我无法初始化它的结构中声明的。或者看起来是这样,因为我收到错误:当我尝试这样做时,不能在结构中包含实例字段初始化器:public uint[] Freqs = new uint[100];
  • 您是打算将数组与结构的其余部分内联(使其长度为 (1+100) x 4 字节)还是将数组作为单独的对象,结构包含 int字段和指向数组的指针(因此只有 8 或 12 个字节长)? C# 仅支持后一种情况,而不会过度使用 unsafe。

标签: c# arrays winforms


【解决方案1】:

问题是array is never instantiated, hence the NullReferenceException。由于结构与类略有不同,因此您必须提供有关创建对象的信息,而不是稍后再分配。

像这样:

public struct My_FSet
{
    public readonly int Num;
    [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 100)]
    public readonly uint[] Freqs;

    public My_FSet(int num, uint[] freqs)
    {
        this.Num = num;
        this.Freqs = freqs;
    }
}

然后你可以在构造函数中提供数组:

My_FSet f = new My_FSet(1, new uint[] { 1, 2, 3 });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    相关资源
    最近更新 更多