Pripažinkite konstanti masyvą

Ar galiu parašyti kažką panašaus į šiuos dalykus?

 public const string[] Titles = {"German", "Spanish", "Corrects", "Wrongs"}; 
258
28 февр. nustatė Jaime Oro vasario 28 d 2011-02-28 16:04 '11, 16:04, 2011-02-28 16:04
@ 12 atsakymų

Taip, bet jūs turite ją pasakyti readonly vietoj const :

 public static readonly string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" }; 

Taip yra todėl, kad const gali būti taikomas tik laukui, kurio vertė žinoma kompiliavimo metu. Jūsų nurodytas masyvo iniciatorius nėra pastovi išraiška C #, todėl sukuria kompiliatoriaus klaidą.

readonly deklaracija išsprendžia šią problemą, nes reikšmė nėra inicijuojama iki runtime (nors ir garantuojama, kad ji buvo inicijuota prieš pirmą masyvo naudojimą).

Priklausomai nuo to, ką galiausiai norite pasiekti, taip pat galite apsvarstyti skelbimų skelbimą:

 public enum Titles { German, Spanish, Corrects, Wrongs }; 
434
28 февр. atsakymą pateikė Cody Gray vasario 28 d. 2011-02-28 16:07 '11 at 16:07 2011-02-28 16:07

Galite deklaruoti masyvą kaip readonly , tačiau reikia nepamiršti, kad galite modifikuoti masyvo elementą readonly .

 public readonly string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" }; ... Titles[0] = "bla"; 

Apsvarstykite galimybę naudoti „Enums“, kaip siūlo Cody arba IList.

 public readonly IList<string> ITitles = new List<string> {"German", "Spanish", "Corrects", "Wrongs" }.AsReadOnly(); 
45
28 февр. Atsakymą pateikė Branimiras vasario 28 d. 2011-02-28 16:23 '11, 16:23, 2011-02-28 16:23

Negalite sukurti „const“ masyvo, nes masyvai yra objektai ir gali būti sukurti tik vykdymo metu, ir const objektai yra išspręsti kompiliavimo metu.

Vietoj to, galite nurodyti savo masyvą kaip „tik skaitymą“. Tai turi tą patį poveikį kaip const, išskyrus tai, kad vertė gali būti nustatyta vykdymo metu. Tai galima nustatyti vieną kartą, o po to ji bus tik skaitoma (t.y. const).

38
28 февр. Atsakymą pateikė JAiro vasario 28 d. 2011-02-28 16:08 '11 at 16:08 2011-02-28 16:08

Galite naudoti kitą metodą: apibrėžti pastovią eilutę, kuri atspindi jūsų masyvą, ir tada padalinkite eilutę į masyvą, kai to reikia, pvz.

 const string DefaultDistances = "5,10,15,20,25,30,40,50"; public static readonly string[] distances = DefaultDistances.Split(','); 

Šis metodas suteikia jums pastovią, kuri gali būti saugoma konfigūracijoje ir prireikus konvertuojama į masyvą.

Alastair

8
26 сент. atsakymas duotas Alastair 26 sept. 2013-09-26 13:54 '13, 13:54, 2013-09-26 13:54

Mano poreikiams, aš apibrėžiau static o ne neįmanoma, masyvą ir jis veikia: public static string[] Titles = { "German", "Spanish", "Corrects", "Wrongs" };

6
24 апр. Atsakyti ALZ 24 bal . 2013-04-24 17:12 '13, 17:12, 2013-04-24 17:12

Kadangi C # 6 galite jį rašyti taip:

 public static string[] Titles => new string[] { "German", "Spanish", "Corrects", "Wrongs" }; 

Taip pat žiūrėkite: С #: naujas ir patobulintas С # 6.0 (ypač skyrių „Funkcinių funkcijų ir savybių išraiška“)

Tai padarys statinę tik skaitymo savybę, tačiau ji vis tiek leis jums pakeisti grąžinamos masyvo turinį, bet kai dar kartą skambinate į turtą, gausite originalų nepakeistą masyvą.

Siekiant aiškumo, šis kodas yra toks pat (arba iš tikrųjų santrumpa):

 public static string[] Titles { get { return new string[] { "German", "Spanish", "Corrects", "Wrongs" }; } } 

Atkreipkite dėmesį, kad šio požiūrio trūkumas - kiekviena nuoroda iš tiesų sukuriama nauja masyvas, todėl, jei naudojate labai didelį masyvą, tai gali būti ne pats efektyviausias sprendimas. Bet jei pakartotinai naudosite tą patį masyvą (pvz., Įdėję jį į privatų atributą), jis vėl atidarys galimybę pakeisti masyvo turinį.

Jei norite turėti nekintamą masyvą (arba sąrašą), galite naudoti:

 public static IReadOnlyList<string> Titles { get; } = new string[] { "German", "Spanish", "Corrects", "Wrongs" }; 

Tačiau vis dar gresia pavojus keisti, nes vis tiek galite jį grąžinti į [] eilutę ir pakeisti turinį:

 ((string[]) Titles)[1] = "French"; 
5
09 авг. atsakymą pateikė mjepson 09 rug . 2016-08-09 09:54 '16 at 9:54 am 2016-08-09 09:54

NET Framework v4.5 +“ sprendimas, kuris pagerina „ tdbeckett“ atsakymą :

 using System.Collections.ObjectModel; // ... public ReadOnlyCollection<string> Titles { get; } = new ReadOnlyCollection<string>( new string[] { "German", "Spanish", "Corrects", "Wrongs" } ); 

Pastaba Atsižvelgiant į tai, kad kolekcija yra konceptualiai pastovi, tikslinga, kad jis būtų static , kad jis būtų paskelbtas klasės lygmeniu.

Pirmiau:

  • Inicijuoja netiesioginio palaikymo lauko nuosavybę po masyvo naudojimo.

    • Atkreipkite dėmesį, kad { get; } { get; } - tai yra tik getter savybės deklaravimas - tai daro tai, kad pats turtas netiesiogiai suprantamas (bandymas derinti readonly su { get; } iš tikrųjų yra sintaksės klaida).

    • Arba galite tiesiog praleisti { get; } { get; } ir pridėkite „ readonly kad sukurtumėte lauką vietoj turto, kaip ir klausime, tačiau tai yra geras būdas skelbti viešuosius duomenų elementus kaip savybes, o ne laukus.

  • Sukuria masyvo struktūrą (leidžiančią indeksuotai prieigai), kad tikrai ir patikimai skaityti (konceptualiai, nuolat, po kūrimo), kaip ir su:

    • užkirsti kelią kolekcijos keitimui (pvz., ištrinti ar pridėti elementus arba pakeisti kolekciją)
    • išvengti atskirų elementų pakeitimo.
      (Netgi netiesioginė modifikacija neįmanoma - skirtingai nei IReadOnlyList<T> sprendimas, kur veiksmas (string[]) gali būti naudojamas rašyti prieigai prie elementų, kaip parodyta naudingame atsakyme mjepsen .
      Tas pats pažeidžiamumas taikomas IReadOnlyCollection<T> sąsajai, kuri, nepaisant pavadinimo panašumo su „ ReadOnlyCollection klase, net nepalaiko indeksuotos prieigos, todėl ji iš esmės netinka prieigai prie masyvo).
3
05 апр. atsakymas duotas mklement0 05 Bal 2017-04-05 16:51 '17 at 4:51 pm 2017-04-05 16:51

Taip galite padaryti tai, ko norite:

 using System; using System.Collections.ObjectModel; using System.Collections.Generic; public ReadOnlyCollection<string> Titles { get { return new List<string> { "German", "Spanish", "Corrects", "Wrongs" }.AsReadOnly();}} 

Tai labai panaši į skaitytojo masyvo vykdymą.

3
08 авг. atsakymas duodamas 08 d. 2014-08-08 23:20 '14, 23:20 2014-08-08 23:20

Manau, kad tai galite padaryti tik skaityti.

2
28 февр. atsakymas duotas skaz 28 Vas. 2011-02-28 16:06 '11 at 16:06 2011-02-28 16:06

Arba, norėdami patekti į elemento problemą, kuri gali būti modifikuojama naudojant tik skaitymo masyvą, galite naudoti statinę nuosavybę. (Atskirus elementus vis dar galima keisti, tačiau šie pakeitimai bus atlikti tik vietinėje masyvo kopijoje.)

 public static string[] Titles { get { return new string[] { "German", "Spanish", "Corrects", "Wrongs"}; } } 

Žinoma, tai nebus ypač veiksminga, nes kiekvieną kartą sukuriant naują eilutę.

1
23 сент. Atsakymas pateiktas Hutch 23 Sep. 2015-09-23 02:00 '15 , 2:00 2015-09-23 02:00

Įrenginiai tikriausiai yra vienas iš tų dalykų, kuriuos galima įvertinti tik vykdymo metu. Konstantai turi būti vertinami kompiliavimo metu. Pabandykite naudoti tik „read“, o ne „const“.

1
28 февр. atsakė nemke 28 feb . 2011-02-28 16:07 '11 at 16:07 2011-02-28 16:07

Jei deklaruojate masyvą už „IReadOnlyList“ sąsajos, jūs gaunate nuolatinį masyvą su pastoviomis vertėmis, deklaruotomis vykdymo metu:

 public readonly IReadOnlyList<string> Titles = new [] {"German", "Spanish", "Corrects", "Wrongs" }; 

Yra .NET 4.5 ir naujesnėse versijose.

0
17 окт. Richard Garside atsakymas spalio 17 d 2017-10-17 12:32 '17 at 12:32 2017-10-17 12:32

Kiti klausimai apie žymų arba Ask a question