Ważne jest zrozumienie pojęć programowania w języku C # przed przystąpieniem do implementacji kodu. Zanim przejdziemy do różnic między const i readonly, najpierw zrozummy słowa kluczowe i sposób ich użycia w programie. Oba są najczęstszymi słowami kluczowymi używanymi w programowaniu w C # i zasadniczo w tym samym celu. Jednak oba słowa kluczowe bardzo się od siebie różnią. Const jest słowem zastrzeżonym używanym do reprezentowania stałych wartości i określa, że wartości nie można modyfikować po czasie kompilacji, natomiast readonly jest modyfikatorem, którego można używać w polach, a którego wartość można zmieniać w czasie wykonywania. Rzućmy okiem na niektóre kluczowe różnice między const i readonly.
Const odnosi się do zmiennej stałej, której wartość należy przypisać tylko raz, podczas deklaracji. Kiedy słowo kluczowe const jest używane podczas deklaracji, staje się stałe, co oznacza, że wartość pozostaje stała i nie można jej zmienić w całym programie. Jest to bardziej słowo zastrzeżone, które oznacza, że wartość nie może być modyfikowana po czasie kompilacji. Stała domyślnie jest domyślnie statyczna, więc można ją wywołać z nazwą klasy przy użyciu „Classname.VariableName”. Stałe wartości są również nazywane literałami. Może to być dowolny podstawowy typ danych, taki jak liczba całkowita, stała zmienna lub literał łańcuchowy.
Słowo kluczowe Readonly jest modyfikatorem, którego można używać tylko w polach, ale nie w zmiennych lokalnych. Pole tylko do odczytu można zainicjować w momencie deklaracji lub wewnątrz konstruktora w tej samej klasie, więc wartości mogą być różne dla różnych wykonań programu w zależności od użytego konstruktora. Słowo kluczowe readonly określa, że zmiennej instancji obiektu nie można modyfikować, a każda próba modyfikacji po deklaracji powoduje błąd kompilacji. Zmienna staje się niemodyfikowalna dopiero po wykonaniu. Zmienne są tworzone tylko do odczytu, aby przestać wywoływać kod przed przypadkową modyfikacją po zbudowaniu.
Słowo kluczowe stała (const) jest niczym innym jak niezmiennymi zmiennymi, których wartość można zainicjować tylko w czasie kompilacji. Te stałe wartości są również nazywane literałami. Po prostu pozwala nam określić, czy zmienną można modyfikować, czy nie. Mówiąc prościej, stałe są domyślnie statyczne i powinny zostać zainicjowane przed użyciem w programie. Z drugiej strony słowo kluczowe readonly to modyfikator, którego można używać w polach, a jego wartość można zmieniać w czasie wykonywania. Zapobiega zmianie pól, których wartości można ustawić za pomocą zmiennych referencyjnych.
Const jest domyślnie statyczny, a wartości, do których należy przypisać w czasie deklaracji zmiennej, co oznacza, że wartości są przypisywane tylko w czasie kompilacji. Stała deklarowana jest za pomocą słowa kluczowego „const”. Inicjalizacja stałego pola musi być stałym wyrażeniem i nie może być modyfikowana. Mówiąc najprościej, const jest stałą czasową kompilacji. Z drugiej strony, pole tylko do odczytu można zainicjować tylko na poziomie klasy, a nie wewnątrz metody, a pola nie można zmodyfikować po inicjalizacji. Innymi słowy, zmienne tylko do odczytu mogą być inicjalizowane w momencie deklaracji lub w konstruktorze.
Stała wartość jest umieszczana bezpośrednio w kodzie, ponieważ działa jak zamiennik w czasie kompilacji. Kompilator umieszcza stałą wartość w metadanych zestawu, które definiują stałą, i osadza wartość w samym kodzie IL po inicjalizacji, więc nie jest wymagana pamięć dla stałych w czasie wykonywania do alokacji. Wartość tylko do odczytu nie jest stała i jest przechowywana w stercie modułu ładującego, której pamięci nie można przydzielić, dopóki jej typ nie zostanie załadowany. Pola tylko do odczytu są przechowywane w pamięci dynamicznej, więc wartości można uzyskać tylko w czasie wykonywania.
Chociaż oba słowa kluczowe są używane prawie w tym samym celu, mają inną semantykę wersjonowania binarnego. Gdy wyrażenie odwołuje się do stałej, kompilator osadza wartość w czasie kompilacji. Jeśli więc wartość zostanie użyta w innym zestawie, oryginalny zespół musi zostać zaktualizowany, a wartość należy zmienić. Zmiany w zestawie nie są odzwierciedlane, dopóki nie zostanie ponownie skompilowane. Wartość nie jest uzyskiwana do czasu wykonania, gdy wyrażenie odwołuje się do pola tylko do odczytu. Jeśli wartość zostanie zmieniona w innym zespole, zmiany zostaną odzwierciedlone w zespole, gdy tylko zostanie załadowany bez konieczności jego ponownej kompilacji.
Oba słowa kluczowe są używane do tego samego, co deklarowanie członka, aby wartości nie mogły być zmieniane w całym programie. Jednak słowo kluczowe const różni się bardzo od słowa kluczowego tylko do odczytu. Const jest zmienną stałą, której wartość należy zainicjować w czasie kompilacji, natomiast pole tylko do odczytu można zainicjować tylko na poziomie klasy, w momencie deklaracji lub w konstruktorze. Const jest stałą czasu kompilacji, podczas gdy pola tylko do odczytu są tylko do odczytu. Dostęp do zmiennych Constance można uzyskać za pomocą „Classname.VariableName”, natomiast zmienne tylko do odczytu można uzyskać za pomocą „InstanceName.VariableName”. Ponadto zmienne const mogą być deklarowane w metodach, podczas gdy pola tylko do odczytu nie mogą być deklarowane w metodach.