【问题标题】:How to initialize array of struct?如何初始化结构数组?
【发布时间】:2011-08-16 13:50:38
【问题描述】:

功能失调的例子:

public struct MyStruct { public int i, j; }

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

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

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

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

【问题讨论】:

  • @Code Monkey:我已经阅读了那个问题和答案,但这对我没有一点帮助。
  • @JeremyDWill:问题不在于“const”——我很高兴将其更改为“static readonly”。问题在于初始化结构数组的语法。
  • @karx11erx - 正如最初写的那样, CONST 一个问题。现在您已经更改了问题,我的评论不再适用,但在我发表评论时,它绝对适用的。

标签: c#


【解决方案1】:

您面临的问题与使用结构作为数组类型无关。如果您使用类,您的语法也会无效。

这行得通:

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...

但这不能使用简写初始化语法来实现。

【讨论】:

  • 无效的语法涉及结构...... OP说它不起作用。
  • @Henk:我修改了那句话,所以它表达了我的真正意思。
  • 好吧,我认为 myTable 的元素是值而不是引用类型(即 myTable 指向的内存位置实际上包含 3 个 MyStruct 对象,而不是指向 MyStruct 对象的 3 个指针)。那么为什么我必须在 myTable 的初始化中分配结构呢?这只是语法,C# 编译器将简单地初始化 3 个 MyStruct 对象,还是实际上会在堆上分配 3 个 MyStruct 对象?
  • 我知道。这就是我写“dysfunctional”的原因。
  • @karx11erx:我稍微扩展了我的答案,以回答您的“这只是语法”问题。但是,我真的不知道是否会为此在堆栈或堆上创建对象。也许,you really shouldn't care.
【解决方案2】:

您需要使用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)
};

【讨论】:

  • 是的,有语法错误,但那是因为我不知道如何在struct数组中编写struct对象的简写初始化。我已经编辑了我的问题,以使关键问题更加清晰。
  • 当数组元素为值类型时,为什么需要为每个数组元素调用“new MyStruct()”?
  • @karl11erx。你需要调用 new MyStruct() 来显式调用构造函数。这只是调用它的语法
  • @karl11erx,您必须使用构造函数 (new MyStruct()) 对其进行初始化,因为该数组只会采用 MyStruct 的数据类型,而构造函数是当前创建 MyStruct 类型对象的唯一方法
  • 哦!那么真正发生的是创建了一个临时的 MyStruct 对象并复制到了数组中的 MyStruct 对象中,对吧!
猜你喜欢
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
相关资源
最近更新 更多