Инициализация массива структур в C # - PullRequest
43 голосов
/ 21 ноября 2008

Как я могу инициализировать массив const / static структур как можно более четко?

class SomeClass
{

    struct MyStruct
    {
        public string label;
        public int id;
    };

    const MyStruct[] MyArray = {
          {"a", 1}
          {"b", 5}
          {"q", 29}
    };
};

Ответы [ 5 ]

50 голосов
/ 21 ноября 2008

Во-первых, вам действительно нужно иметь изменяемую структуру? Они почти всегда плохая идея. Аналогично публичным полям. Есть некоторые очень случайные контексты, в которых они разумны (обычно обе части вместе, как в ValueTuple), но они довольно редки в моем опыте.

Кроме этого, я бы просто создал конструктор, принимающий два бита данных:

class SomeClass
{

    struct MyStruct
    {
        private readonly string label;
        private readonly int id;

        public MyStruct (string label, int id)
        {
            this.label = label;
            this.id = id;
        }

        public string Label { get { return label; } }
        public string Id { get { return id; } }

    }

    static readonly IList<MyStruct> MyArray = new ReadOnlyCollection<MyStruct>
        (new[] {
             new MyStruct ("a", 1),
             new MyStruct ("b", 5),
             new MyStruct ("q", 29)
        });
}

Обратите внимание на использование ReadOnlyCollection вместо предоставления самого массива - это сделает его неизменяемым, избегая проблемы с непосредственным отображением массивов . (Кодовое шоу действительно инициализирует массив структур - затем он просто передает ссылку на конструктор ReadOnlyCollection<>.)

24 голосов
/ 21 ноября 2008

Вы используете C # 3.0? Вы можете использовать инициализаторы объектов следующим образом:

static MyStruct[] myArray = 
            new MyStruct[]{
                new MyStruct() { id = 1, label = "1" },
                new MyStruct() { id = 2, label = "2" },
                new MyStruct() { id = 3, label = "3" }
            };
4 голосов
/ 21 ноября 2008

Вы не можете инициализировать ссылочные типы по умолчанию, кроме нуля. Вы должны сделать их только для чтения. Так что это может сработать;

    readonly MyStruct[] MyArray = new MyStruct[]{
      new MyStruct{ label = "a", id = 1},
      new MyStruct{ label = "b", id = 5},
      new MyStruct{ label = "c", id = 1}
    };
0 голосов
/ 24 октября 2017

Измените const на static readonly и инициализируйте его следующим образом

static readonly MyStruct[] MyArray = new[] {
    new MyStruct { label = "a", id = 1 },
    new MyStruct { label = "b", id = 5 },
    new MyStruct { label = "q", id = 29 }
};
0 голосов
/ 21 ноября 2008

Я бы использовал статический конструктор для класса, который устанавливает значение статического массива только для чтения.

public class SomeClass
{
   public readonly MyStruct[] myArray;

   public static SomeClass()
   {
      myArray = { {"foo", "bar"},
                  {"boo", "far"}};
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...