Stałe

Często w trakcie pisania algorytmu używamy liczb stałych. Oczywiście, możemy w całym kodzie umieszczać je w postaci liczbowej. Przysparza to jednak pewne problemy . Zmniejsza czytelność kodu. Gdy po dłuższym czasie wrócimy do naszej aplikacji, możemy się zastanawiać co dana liczba oznacza, dlaczego ją tam umieściliśmy. Innym problem pojawi się gdy będziemy chcieć zmienić wartość liczby stałej, którą pisaliśmy w sposób liczbowy. Jak nazwa wskazuje stałej liczby nie powinniśmy zmieniać. Jednak nie do końca tak jest. Wartość liczby stałej nie powinna się zmieniać w trakcie działania aplikacji. Czyli nasz kod nie powinien na nią w żaden sposób wpływać, może ją jedynie wykorzystywać. Ale co w przypadku gdy chcemy zwiększyć dokładność wyliczeń algorytmu poprzez np. zwiększenie dokładności liczby pi z 3,14 na 3,1415926535. Szukanie jej wszystkich wystąpień w algorytmie, może być bardzo uciążliwe i istnieje duże prawdopodobieństwo, że jakieś wystąpienie pominiemy i nie zmienimy jego wartości, przez co nasz algorytm nie będzie dawał nam zadawalającego wyniku. Z pomocą w takiej sytuacji przychodzi możliwość zadeklarowania stałej. Deklaruje się je podobnie jak zmienne z tą różnicą, że przed typem używamy słowa kluczowego const. Jest jeszcze jeden ważny aspekt używania stałej symbolicznej, musi być ona zainicjalizowana podczas deklaracji. Czyli gdy deklarujemy stałą, nadajemy jej od razu wartość. Dzięki użyciu słowa kluczowego const kompilator nie dopuści do sytuacji aby wartość naszej stałej w dalszej części kodu została zmieniona. Należy pamiętać, że po skompilowaniu wartość stałej zostaje zapamiętana i gdy ją zmieniamy musimy skompilować wszystkie źródła gdzie ona występuje. Stałe mogą być tylko typu liczbowego, logicznego lub znakowego, nie mogą być typem złożonym.

Zobaczmy przykład:

class Program {
  static void Main() {
    const double pi = 3.14;
    pi = 7;
  }
}

Kompilator zgłosi nam błąd:

Zmienne rys4

Rys. Błąd zgłoszony przez kompilator

Jak widzimy lewa strona wyrażenia musi być zmienną, własnością lub indeksatorem. Z tego błędu można w prosty sposób wywnioskować, że nie możemy przypisać nowej wartości dla stałej.
Zobaczmy inny przykład użycia stałej:

class Program {
  static void Main() {
    const double pi = 3.14;
    double wynik, b;
    b = 10;
    b = 10 + pi;
    wynik = b + 2+pi;

    Console.WriteLine("Wynik: " + wynik);
    Console.ReadLine();

  }
}

Rezultat działania naszej aplikacji:

Zmienne rys5

Rys. Wyświetlenie wyniku na ekranie.

Używanie stałych jest bardzo wygodne. Wykorzystujemy je wręcz w sposób intuicyjny.

Uwaga:

Gdy wykorzystujemy wartości stałych z innego kodu np.  biblioteki DLL musimy zachować ostrożność. W przypadku pojawienia się nowej wersji biblioteki wartość dla stałej ulegnie zmianie wymagana jest ponowna kompilacja kodu. Ponieważ stara wartość będzie pamiętana w aplikacji.

Pola tylko do odczytu

To pola, których wartości są ustalane podczas tworzenia obiektu. Ich wartość nie może zostać zmieniona w dalszej części kodu. Aby stworzyć pole tylko do odczytu używamy słowa kluczowego readonly. Wartość, możemy ustalić podczas deklaracji lub w konstruktorze. W przeciwieństwie do stałej, wartość pola tylko do odczytu, możemy wczytać z pliku lub uzyskać z funkcji. Inną istotną różnicą jest fakt, że to pole może być dowolnego typu.

    public readonly string Nazwa= "Testowa nazwa";

Podsumowanie:
Stałych używamy gdy wiemy, że ich wartość się nie zmieni. Gdy chcemy aby zmienna pobierała wartość z pliku lub innej funkcji ale nie mogła zostać zmieniona używamy pola readonly.