Initial en rekke Structs i C #

stemmer
41

Hvordan kan jeg initialisere en const / statisk rekke structs så tydelig som mulig?

class SomeClass
{

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

    const MyStruct[] MyArray = {
          {a, 1}
          {b, 5}
          {q, 29}
    };
};
Publisert på 21/11/2008 klokken 17:09
kilden bruker
På andre språk...                            


5 svar

stemmer
47

For det første trenger du virkelig trenger å ha en foranderlig struct? De er onde. Likeledes offentlige felt.

Annet enn det, ville jeg bare lage en konstruktør ta to biter av data:

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

Legg merke til bruken av ReadOnlyCollection i stedet for å utsette tabellen selv - dette vil gjøre det uforanderlige, unngå problemet utsette arrays direkte . (Kode vis gjør initialisere en rekke structs - det da bare passerer referanse til konstruktøren av ReadOnlyCollection<>).

Svarte 21/11/2008 kl. 17:18
kilden bruker

stemmer
23

Bruker du C # 3.0? Du kan bruke objekt initializers slik:

static MyStruct[] myArray = 
            new MyStruct[]{
                new MyStruct() { id = 1, label = "1" },
                new MyStruct() { id = 2, label = "2" },
                new MyStruct() { id = 3, label = "3" }
            };
Svarte 21/11/2008 kl. 17:22
kilden bruker

stemmer
4

Du kan ikke initialreferansetypene som standard annet enn null. Du må gjøre dem skrivebeskyttet. Så dette kan fungere;

    readonly MyStruct[] MyArray = new MyStruct[]{
      new MyStruct{ label = "a", id = 1},
      new MyStruct{ label = "b", id = 5},
      new MyStruct{ label = "c", id = 1}
    };
Svarte 21/11/2008 kl. 17:24
kilden bruker

stemmer
0

Bytt consttil static readonlyog initiere det sånn

static readonly MyStruct[] MyArray = new[] {
    new MyStruct { label = "a", id = 1 },
    new MyStruct { label = "b", id = 5 },
    new MyStruct { label = "q", id = 29 }
};
Svarte 24/10/2017 kl. 18:13
kilden bruker

stemmer
-2

Jeg vil bruke en statisk konstruktør på klassen som setter verdien av en statisk skrivebeskyttet array.

public class SomeClass
{
   public readonly MyStruct[] myArray;

   public static SomeClass()
   {
      myArray = { {"foo", "bar"},
                  {"boo", "far"}};
   }
}
Svarte 21/11/2008 kl. 17:41
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more