Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结构内部的c#2D数组_C#_Arrays_Struct - Fatal编程技术网

结构内部的c#2D数组

结构内部的c#2D数组,c#,arrays,struct,C#,Arrays,Struct,我需要从一个方法返回一个结构。结构的一个成员必须是二维数组。我知道使用固定大小的缓冲区来声明结构中数组的大小,以及使用 [StructLayout(LayoutKind.Explicit)] public struct struct1 { [FieldOffset(0)] .... } 但问题是。我不能这样做,因为我事先不知道阵列的长度。数组的大小取决于用户在运行时选择的参数 struct foo { int x; double[,] A = new d

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

[StructLayout(LayoutKind.Explicit)]
public struct struct1
{
    [FieldOffset(0)]
       ....
}
但问题是。我不能这样做,因为我事先不知道阵列的长度。数组的大小取决于用户在运行时选择的参数

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

   internal Foo(Int32 sizeX, Int32 sizeY)
   {
     this.bar = new Double[sizeX, sizeY];
   }
}
我不知道是N还是M提前了。它们由用户在运行时选择

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

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

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

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

struct foo {
    int x;
    double[,]  A = new double[N, M];
};
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;
}

将为您提供一个Foo实例,其中字段栏引用维度为12 x 34的双数组。

有什么原因不能使用类吗?这是较大代码的一部分。我不想要头顶的东西。此外,结构是通过引用而不是通过值传递的。(我想)。堆栈与堆问题。类也通过引用传递。如果在结构上使用类的开销会对系统产生重大影响,则系统存在重大设计问题。C#设计用于优化和很好地使用类。。。使用语言,这不是C++。不要预优化问题的一部分还在于结构的成员都是数据类型。没有办法。最后,我也不确定如何使用类来实现它。此外,结构在处理的每一组数据上都会完全更新。这非常好,谢谢。我复制了这一点,但在行中出现了一个错误:内部双[,]bar=null;;错误状态为“结构中不能有实例字段初始值设定项”。请参阅我对该问题的最后一条评论。我正在处理它。当我将其作为ref参数传递给某个方法时,仍然会在不一致的可访问性级别上出错,但我认为我可以解决这个问题。我已解决了可访问性问题,但遇到了错误:Foo不包含bar的定义,并且找不到接受Foo类型的第一个参数的扩展方法bar(是否缺少using指令或程序集引用?)这是因为
bar
被声明为
private
-您必须使其可见,或者可能更好地提供一个包装字段的可见属性。不一致的可访问性是由于示例代码将结构
Foo
声明为internal,并且您可能在带有
public
visib的方法中使用它因此,您必须再次调整可见性。