Odpowiedzi:
const
Obiekt jest zawsze static
.
Ze specyfikacji języka C # (strona PDF 287 - lub 300 strona pliku PDF):
Mimo że stałe są uważane za elementy statyczne, stała deklaracja nie wymaga ani nie pozwala na modyfikator statyczny.
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.
C # const
to dokładnie to samo co Java, tyle final
że absolutnie zawsze static
. Moim zdaniem tak naprawdę nie jest konieczne, aby const
zmienna nie była static
, ale jeśli potrzebujesz uzyskać dostęp do const
zmiennej w static
inny sposób, możesz:
class MyClass
{
private const int myLowercase_Private_Const_Int = 0;
public const int MyUppercase_Public_Const_Int = 0;
/*
You can have the `private const int` lowercase
and the `public int` Uppercase:
*/
public int MyLowercase_Private_Const_Int
{
get
{
return MyClass.myLowercase_Private_Const_Int;
}
}
/*
Or you can have the `public const int` uppercase
and the `public int` slighly altered
(i.e. an underscore preceding the name):
*/
public int _MyUppercase_Public_Const_Int
{
get
{
return MyClass.MyUppercase_Public_Const_Int;
}
}
/*
Or you can have the `public const int` uppercase
and get the `public int` with a 'Get' method:
*/
public int Get_MyUppercase_Public_Const_Int()
{
return MyClass.MyUppercase_Public_Const_Int;
}
}
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.
final
zachowuje się dokładnie jak C # readonly
i wcale nie tak const
.
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) .