Kodėl mano klasėje negaliu naudoti „viešosios statinės const string S =„ stuff “?

Kai bandau surinkti savo klasę, gaunu klaidos pranešimą:

'NamespaceName.ClassName.CONST_NAME' konstanta negali būti pažymėta kaip statinė.

eilėje:

 public static const string CONST_NAME = "blah"; 

Visą laiką galėčiau tai padaryti java. Ką aš darau neteisingai? Ir kodėl tai neleidžia man tai padaryti?

205
03 янв. nustatė jjnguy sausio 03 d 2009-01-03 01:35 '09 ne 1:35 2009-01-03 01:35
@ 6 atsakymai

const objektas visada yra static .

388
03 янв. Atsakymą pateikė Joel Coehoorn sausio 03 d 2009-01-03 01:37 '09 ne 1:37 2009-01-03 01:37

C # specifikacijos (PDF puslapis 287 - arba 300-ojo PDF puslapis):

Nors konstantos yra laikomos statinėmis, nuolatinė deklaracija nereikalauja ir neleidžia naudoti statinio modifikatoriaus.

77
03 янв. atsakymas duotas splattne 03 jan. 2009-01-03 01:40 '09 ne 1:40 2009-01-03 01:40

Constant elementas laikomas statiniu kompilatoriumi, taip pat reiškia pastoviosios vertės semantiką, o tai reiškia, kad nuorodos į konstantą gali būti panaudotos kodo kaip pastovaus elemento reikšmės, o ne elemento nuoroda.

Kitaip tariant, const narys, turintis reikšmę 10, gali būti sukompiliuotas į kodą, kuris jį naudoja kaip skaičių 10, o ne nuorodą į const narį.

Tai skiriasi nuo tik statinio lauko, kuris visada bus sudarytas kaip nuoroda į lauką.

Atkreipkite dėmesį, kad tai yra išankstinis jitas. Kai JIT'ter pradeda žaisti, abu šie kodai gali būti vertinami kaip tiksliniai kodai.

30
03 янв. Lasse Vågsæther Karlsen atsakymas 03 Jan 2009-01-03 01:41 '09, 1:41 val. 2009-01-03 01:41

C # const yra tas pats, kaip „Java“ final , išskyrus absoliučiai static . Mano nuomone, nebūtina, kad const kintamasis nebūtų static , bet jei jums reikia prieiti prie kintamojo const static , galite:

 class MyClass { private const int myLowercase_Private_Const_Int = 0; public const int MyUppercase_Public_Const_Int = 0;  public int MyLowercase_Private_Const_Int { get { return MyClass.myLowercase_Private_Const_Int; } }  public int _MyUppercase_Public_Const_Int { get { return MyClass.MyUppercase_Public_Const_Int; } }  public int Get_MyUppercase_Public_Const_Int() { return MyClass.MyUppercase_Public_Const_Int; } } 

Taigi, dabar suprantu, kad šis klausimas buvo užduotas prieš ketverius metus, tačiau kadangi aš praleidau apie 2 valandas darbo, kai bandau naudoti įvairius būdus, kaip atsakyti ir formuoti kodą, vis tiek skelbiu jį šiame atsakyme :)

Bet, užrašu, aš vis dar jaučiuosi kvailas.

5
20 марта '13 в 3:39 2013-03-20 03:39 atsakymą pateikė „ Meowmaritus“ kovo 20 d., 13 d., 03:39 2013-03-20 03:39

Iš MSDN: http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx

... Be to, nors const laukas yra kompiliavimo laiko konstanta , skaitymo laukas gali būti naudojamas vykdymo laiko konstantoms ...

Taigi, naudojant statinius laukuose, yra tarsi bandyti padaryti tam tikrą (C # define) statinį C / C ++ ... Kadangi jis pakeičiamas verte kompiliavimo metu, jis yra paleistas vieną kartą visais atvejais (= statinis ).

4
30 сент. Atsakymas suteikiamas 30- ojo kėlinio . 2013-09-30 14:21 '13, 14:21 val. 2013-09-30 14:21

const yra panašus į statinį, abu kintamuosius galime pasiekti su klasės pavadinimu, tačiau diferencinius statinius kintamuosius galima keisti, tačiau const negali.

2
07 июня '13 в 10:10 2013-06-07 10:10 atsakymas pateikiamas soujanya birželio 07 d. 13 val. 10:10 2013-06-07 10:10

Kiti klausimai apie žymes arba Užduoti klausimą