Stałe
msm
Wstęp
Na początek może trochę teorii. Czym są stałe? Stałe to w pewnym sensie zmienne "okrojone" z możliwości jakiegokolwiek wpływania na ich wartość w trakcie działania programu (muszą być też typem prostym). W czasie kompilowania programu kompilator zastępuje wszystkie stałe występujące w kodzie ich wartością. Czyli na przykład zapis:
const int Stała = 10;
for (int i = 1; i < Stała; i++)
zostanie skompilowany jak
const int Stała = 10;
for (int i =1; i < 10; i++)
Zaczynamy
Jak łatwo zauważyć w obydwu kodach występuje słowo kluczowe const poprzedzające stworzenie zmiennej (?) typu int. Równie łatwo domyślić się że "zmienna" zmienną już nie jest - const sprawiło że kompilator traktuje ją jako stałą.
Jeśli ktoś nie wierzy - można to łatwo sprawdzić. Spróbujcie dodać następną linijkę kodu, na przykład
Stała = 15;
Kompilator będzie bezlitosny. Dlatego stała już podczas deklarowania musi mieć przypisaną wartość.
Język C# pozwala dodatkowo na przypisanie stałej wartości wyrażenia, lecz musi być ono do obliczenia w czasie kompilacji, na przykład:
const int Pierwsza_stała = 10 + 15;
const int Druga_stała = 20 * 2;
const int Trzecia_stała = Pierwsza_stała + 20;
const int Czwarta_stała = Environment.SystemDirectory;
Ale po co?
Wstęp mamy już za sobą. Stałe jak widać nie są wcale skomplikowane w użyciu. Znacznie trudniejsze jest dobre wykorzystanie w programie. Każdy kto zastanowił się nad dotychczas przeczytaną częścią artykułu, a nie miał dotychczas styczności ze stałymi, z pewnością zastanawia się po co w ogóle ich używać? Przecież (rozumuje) zamiast używać stałej w przykładzie powyżej wystarczy zastąpić ją cyfrą 10 i wszystko będzie działało równie dobrze, a nawet lepiej bo kod będzie krótszy. Czy ma racją? Owszem.
My jednak pamiętajmy że powyższy przykład był tylko przykładem i nijak ma się do zawiłości "prawdziwego" programowania. Używanie stałych niweluje ryzyko że, przy poprawianiu czegoś w programie zapomnimy coś zmienić (i doprowadzimy do efektownego wyjątku...).
Uwagi
- Konwencja nazewnicza (stosowana między innymi w biblitekach FCL od Microsoftu) nakazuje zapisywać nazwy stałych "Pascalem" (pierwsza litera każdego słowa duża, reszta małych).
- Sposób traktowania stałych przez kompilator jest dość interesujący (co zostało opisane na początku) - po prostu wstawia je w każde miejsce gdzie kod się do niej odwołuje. Jest to dobre rozwiązanie jeśli chodzi o wydajność, ale niestety, jeśli zmienimy stałą w jednym zastawie, będziemy musieli przekompilować również wszystkie pozostałe zastawy korzystające z tej stałej (bo inaczej odwołania do niej nie zostaną "uaktualnione"). Dlatego jeśli spodziewamy się że "stała" może ulec zmianie lepszym rozwiązaniem będzie stworzenie pola poprzedzonego słowem kluczowym Readonly