如何初始化struct数组?

时间:2011-08-16 13:50:38

标签: c#

功能失调的例子:

public struct MyStruct { public int i, j; }

static readonly MyStruct [] myTable = new MyStruct [3] 
{
    {0, 0}, {1, 1}, {2, 2}
}

我知道这段代码不起作用。现在我该如何写下来(正确的语法)?

这背后的想法如下。 Afaik结构数组的元素是值类型,因此myTable指向包含三个MyStruct对象的内存位置(而不是包含三个(未初始化的)指向MyStruct对象的内存位置)。

那么我该如何初始化那些MyStruct对象,那么正确的语法是什么?我不必再分配它们了,对吗?

2 个答案:

答案 0 :(得分:10)

您遇到的问题与使用结构作为数组类型无关。如果要使用类,语法也将无效。

这有效:

MyStruct [] myTable = new MyStruct [] 
{
    new MyStruct { i = 0, j = 0 },
    new MyStruct { i = 1, j = 1 },
    new MyStruct { i = 2, j = 2 }
};

您必须将集合初始值设定项与对象初始值设定项一起使用。

由于集合初始化器和对象初始化器只是语法糖,这相当于

MyStruct [] myTable = new MyStruct[3]; 
var tmp = new MyStruct();
tmp.i = 0;
tmp.j = 0;
myTable[0] = tmp;
// and so on...

你真正想要的结构数组是:

MyStruct [] myTable = new MyStruct[3]; 
myTable[0].i = 0;
myTable[0].j = 0;
// and so on...

但是使用短手初始化器语法无法实现这一点。

答案 1 :(得分:7)

您需要使用MyStruct的实际实例,您可以使用new关键字创建实例。

这应该有用......

struct MyStruct 
{ 
   int i, j; 

   public MyStruct(int a, int b)
   {
      i = a;
      j = b;
   }
}

static MyStruct[] myTable = new MyStruct[3]
{
   new MyStruct(0, 0),
   new MyStruct(1, 1),
   new MyStruct(2, 2)
};