【问题标题】:c# 2D Array inside a Structc# Struct 内的二维数组
【发布时间】:2013-11-19 21:11:42
【问题描述】:

我需要从方法中返回一个结构。结构的成员之一需要是二维数组。我知道使用固定大小的缓冲区来声明结构中数组的大小以及使用

[StructLayout(LayoutKind.Explicit)]
public struct struct1
{
    [FieldOffset(0)]
       ....
}

但这是问题所在。我不能这样做,因为我事先不知道数组的长度。数组的大小取决于用户在运行时选择的参数。

struct foo {
    int x;
    double[,]  A = new double[N, M];
};

我不知道 N 或 M 提前。它们由用户在运行时选择。

这可能吗?如果是的话,一个人会怎么做?提前感谢您提供的任何建议或建议。

【问题讨论】:

  • 有什么理由不能使用类吗?
  • 这是较大代码的一部分。不想要开销。此外,结构是通过引用而不是值传递的。 (我想)。堆栈与堆问题也是如此。
  • 类也是通过引用传递的。
  • 如果在此处使用类而不是结构的开销将对您的系统产生重大影响,那么您的系统存在重大设计问题。 C# 旨在优化和使用类......使用语言,这不是 C++。不要预先优化
  • 部分问题还在于结构的成员都是数据类型。没有方法。最后,我也不确定如何使用类来做到这一点。此外,该结构在处理的每组数据上都会完全更新。

标签: c# arrays struct


【解决方案1】:

不可能内联可变大小的数组,因为结构必须具有在编译时已知的固定大小。你当然可以引用一个只有在运行时才知道大小的数组。

internal struct Foo
{
   internal Double[,] bar;

   internal Foo(Int32 sizeX, Int32 sizeY)
   {
     this.bar = new Double[sizeX, sizeY];
   }
}

你可以像这样使用这个结构

private function Foo InitializeFoo(Int32 sizeX, Int32 sizeY)
{
   var foo = new Foo(sizeX, sizeY);

   for (var y = 0; y < sizeY; y++)
   {
      for (var x = 0; x < sizeX; x++)
      {
         foo.bar[x, y] = x * y;
      }
   }

   return foo;
}

然后像这样调用这个方法

var foo = InitializeFoo(12, 34);

会给你一个 Foo 的实例,它的字段栏引用一个大小为 12 x 34 的 Double 数组。

【讨论】:

  • 非常感谢。我已经复制了这个,但在线上出现错误:internal double[,] bar = null;;错误状态“在结构中不能有实例字段初始值设定项。”
  • 查看我对该问题的最后评论。
  • 正在使用它。当我将其作为 ref 参数传递给方法时,仍然会出现不一致的可访问性级别的错误,但我认为我可以解决这个问题。
  • 我已经解决了可访问性问题,但出现了错误:Foo 不包含 bar 的定义,并且找不到接受 Foo 类型的第一个参数的扩展方法 bar(您是否缺少 using 指令还是程序集参考?)
  • 那是因为bar 被声明为private - 您必须使其可见,或者甚至可能更好地提供包装该字段的可见属性。可访问性不一致是由于示例代码将结构 Foo 声明为内部结构,并且您可能在具有 public 可见性的方法中使用了它,因此您必须再次调整可见性。
猜你喜欢
  • 2012-11-30
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多