52 votes

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

55voto

Jon Skeet Points 692016

Premièrement, pensez-vous vraiment avoir une mutable struct? Qu'ils sont mauvais. De même, les champs publics.

Autres que que, que je venais de créer 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 à la place du tableau lui-même - ce qui va le rendre immuable, en évitant le problème d'exposer des tableaux directement.

27voto

Winston Smith Points 12029

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

5voto

Ali Ersöz Points 6699

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

-3voto

Paul Sonier Points 25528

J'utiliserais un constructeur statique sur la classe qui définit la valeur d'un tableau statique en lecture seule.

 public class SomeClass
{
   public readonly MyStruct[] myArray;

   public static SomeClass()
   {
      myArray = { {"foo", "bar"},
                  {"boo", "far"}};
   }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X