Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to initialize array of struct?

Tags:

c#

Dysfunctional Example:

public struct MyStruct { public int i, j; }

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

I know that this code doesn't work. Now how do I write this down please (proper syntax)?

The thought behind this is the following. Afaik the elements of arrays of struct are value types, so myTable points to a memory location containing three MyStruct objects (and not to a memory location containing three (uninitialized) pointers to MyStruct objects).

So how do I go about initializing those MyStruct objects, what would be the right syntax? I don't have to allocate them anymore, right?

like image 256
Razzupaltuff Avatar asked Aug 16 '11 13:08

Razzupaltuff


2 Answers

The problem you are facing has nothing to do with using a struct as the array type. Your syntax would also be invalid if you would use a class.

This works:

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

You have to use collection initializers together with object initializers.

As collection initializers and object initializers are just syntactic sugar, this is equivalent to

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

What you really want with an array of structs is this:

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

But this can't be achieved using the short hand initializer syntax.

like image 58
Daniel Hilgarth Avatar answered Sep 20 '22 22:09

Daniel Hilgarth


You need to use actual instances of your MyStruct, which you can create with the new keyword.

This should work...

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)
};
like image 26
musefan Avatar answered Sep 18 '22 22:09

musefan