web-dev-qa-db-fra.com

Initialisation d'un tableau de structures en C #

Comment puis-je initialiser un tableau const/statique de structures aussi clairement que possible?

class SomeClass
{

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

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

Premièrement, est-ce que vous vraiment devez avoir une structure mutable? Ils sont diaboliques. De même les champs publics.

En dehors de cela, je créerais simplement un constructeur prenant les deux bits de données:

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)
        });
}

Notez l'utilisation de ReadOnlyCollection au lieu d'exposer le tableau lui-même - cela le rendra immuable, en évitant le problème qui expose directement les tableaux . (Le code show initialise un tableau de structures - il passe alors simplement la référence au constructeur de ReadOnlyCollection<>.)

49
Jon Skeet

Utilisez-vous C # 3.0? Vous pouvez utiliser les initialiseurs d’objets comme suit:

static MyStruct[] myArray = 
            new MyStruct[]{
                new MyStruct() { id = 1, label = "1" },
                new MyStruct() { id = 2, label = "2" },
                new MyStruct() { id = 3, label = "3" }
            };
23
Winston Smith

Vous ne pouvez pas initialiser par défaut des types de référence autres que null. Vous devez les faire en lecture seule. Donc, cela pourrait fonctionner;

    readonly MyStruct[] MyArray = new MyStruct[]{
      new MyStruct{ label = "a", id = 1},
      new MyStruct{ label = "b", id = 5},
      new MyStruct{ label = "c", id = 1}
    };
4
Ali Ersöz

Changez const en static readonly et initialisez-le comme ceci

static readonly MyStruct[] MyArray = new[] {
    new MyStruct { label = "a", id = 1 },
    new MyStruct { label = "b", id = 5 },
    new MyStruct { label = "q", id = 29 }
};
0
Shreevardhan