Podczas próby skompilowania mojej klasy pojawia się błąd:
Stała
'NamespaceName.ClassName.CONST_NAME'
nie może być oznaczona jako statyczna.
na linii:
public static const string CONST_NAME = "blah";
Mógłbym to robić cały czas w Javie. Co ja robię źle? I dlaczego mi to nie pozwala?
Ze specyfikacji języka C # (strona PDF 287 - lub 300 strona pliku PDF):
źródło
Element stały jest uznawany przez kompilator za statyczny, jak również implikuje semantykę wartości stałej, co oznacza, że odniesienia do stałej mogą zostać wkompilowane w kod używający jako wartość elementu stałego, zamiast odwołania do elementu.
Innymi słowy, stały element zawierający wartość 10 może zostać skompilowany do kodu, który używa go jako liczby 10, zamiast odwołania do stałego elementu.
Różni się to od statycznego pola tylko do odczytu, które zawsze będzie kompilowane jako odniesienie do pola.
Uwaga, to jest przed JIT. Kiedy JIT'ter wchodzi w grę, może skompilować oba te elementy do kodu docelowego jako wartości.
źródło
C #
const
to dokładnie to samo co Java, tylefinal
że absolutnie zawszestatic
. Moim zdaniem tak naprawdę nie jest konieczne, abyconst
zmienna nie byłastatic
, ale jeśli potrzebujesz uzyskać dostęp doconst
zmiennej wstatic
inny sposób, możesz:Cóż, teraz zdaję sobie sprawę, że to pytanie zostało zadane 4 lata temu, ale ponieważ włożyłem około 2 godzin pracy, polegającej na wypróbowaniu różnego rodzaju odpowiedzi i formatowania kodu, w tej odpowiedzi wciąż go publikuję. :)
Ale, dla przypomnienia, nadal czuję się trochę głupio.
źródło
final
zachowuje się dokładnie jak C #readonly
i wcale nie takconst
.Z MSDN: http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx
... Ponadto, chociaż pole const jest stałą czasu kompilacji , pole tylko do odczytu może być użyte do stałych środowiska wykonawczego ...
Tak więc użycie static w polach const jest jak próba uczynienia zdefiniowanego (za pomocą #define) static w C / C ++ ... Ponieważ jest zastępowana wartością w czasie kompilacji, oczywiście jest inicjowana raz dla wszystkich instancji (= static) .
źródło
const jest podobny do static możemy uzyskać dostęp do obu zmiennych z nazwą klasy, ale diff jest zmienne statyczne można modyfikować, a const nie.
źródło