Stałe i pola readonly
Rozróżniaj const od static readonly.
Stałe i pola readonly to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.
Dwa sposoby ustalania stałych wartości
C# oferuje elementy const i readonly do przechowywania wartości, które nie powinny się zmieniać. Wyglądają podobnie, ale działają zupełnie inaczej. W tej lekcji porównamy oba rozwiązania.
using System;
class Config
{
public const double Pi = 3.14159;
public static readonly DateTime StartedAt = DateTime.Now;
}
class Program
{
static void Main()
{
Console.WriteLine("Pi = " + Config.Pi);
}
}const: stała czasu kompilacji
Element const musi otrzymać wartość literałową już podczas deklaracji i jest zapisywany na stałe w kodzie podczas kompilacji. Jest niejawnie statyczny.
using System;
class Circle
{
public const double Pi = 3.14159;
public static double Area(double r) => Pi * r * r;
}
class Program
{
static void Main()
{
Console.WriteLine(Circle.Area(2).ToString("0.00"));
}
}const musi być literałem
Ponieważ element const jest rozstrzygany podczas kompilacji, może przechowywać wyłącznie wyrażenie stałe: liczby, ciągi znaków, wartości logiczne lub inne elementy const.
using System;
class Limits
{
public const int MaxRetries = 3;
public const int Timeout = MaxRetries * 1000; // const expression OK
}
class Program
{
static void Main()
{
Console.WriteLine(Limits.MaxRetries + ", " + Limits.Timeout);
}
}readonly: stała czasu wykonywania
Pole readonly jest ustawiane raz — podczas deklaracji albo w konstruktorze — i nie może być później zmieniane. Jego wartość może zostać obliczona podczas działania programu.
using System;
class Session
{
public readonly string Id;
public Session(string id)
{
Id = id; // allowed: inside constructor
}
}
class Program
{
static void Main()
{
var s = new Session("abc-123");
Console.WriteLine("Session: " + s.Id);
}
}readonly może używać wartości czasu wykonywania
W przeciwieństwie do const, pole readonly może przechowywać wartość znaną dopiero podczas działania programu, taką jak wygenerowany identyfikator lub bieżący czas.
using System;
class Order
{
public readonly Guid OrderId;
public Order()
{
OrderId = Guid.NewGuid();
}
}
class Program
{
static void Main()
{
var o = new Order();
Console.WriteLine("Has id: " + (o.OrderId != Guid.Empty));
}
}static readonly
Połącz static readonly, aby uzyskać wartość dotyczącą całej klasy, obliczaną raz podczas działania programu. Jest to typowy zamiennik const, gdy wartość nie jest literałem.
using System;
class AppInfo
{
public static readonly string[] Roles = { "admin", "user", "guest" };
}
class Program
{
static void Main()
{
Console.WriteLine("Roles: " + Roles());
}
static int Roles() => AppInfo.Roles.Length;
}Dlaczego const może być ryzykowne między zestawami
Ponieważ wartości const są wstawiane do kodu wywołującego podczas kompilacji, zmiana publicznej stałej const w bibliotece wymaga ponownej kompilacji całego kodu, który z niej korzysta. static readonly pozwala tego uniknąć.
using System;
class Lib
{
public const int Version = 2; // inlined into callers
public static readonly int Build = 100; // read at runtime
}
class Program
{
static void Main()
{
Console.WriteLine(Lib.Version + "." + Lib.Build);
}
}Żadnej z nich nie można ponownie przypisać
Po zainicjalizowaniu ani stałej const, ani pola readonly nie można zmienić. Próba wykonania takiej zmiany powoduje błąd kompilacji.
using System;
class Demo
{
public const int A = 10;
public readonly int B;
public Demo() { B = 20; }
// A = 11; // would not compile
// B = 21; // would not compile outside constructor
}
class Program
{
static void Main()
{
var d = new Demo();
Console.WriteLine(Demo.A + ", " + d.B);
}
}Którą z nich wybrać
Używaj const dla rzeczywistych literałów, które nigdy się nie zmieniają (Pi, MaxInt). Używaj readonly, gdy wartość jest obliczana w czasie działania programu lub może być inna dla poszczególnych instancji.
using System;
class Physics
{
public const double Gravity = 9.81; // universal literal
public readonly double Mass; // per object
public Physics(double mass) { Mass = mass; }
public double Weight() => Mass * Gravity;
}
class Program
{
static void Main()
{
var p = new Physics(10);
Console.WriteLine("Weight: " + p.Weight());
}
}Uwaga dotycząca referencji readonly
readonly blokuje pole, ale nie obiekt, na który to pole wskazuje. Referencji readonly do listy nie można ponownie przypisać, ale zawartość tej listy nadal można zmieniać.
using System;
using System.Collections.Generic;
class Cart
{
public readonly List<string> Items = new List<string>();
}
class Program
{
static void Main()
{
var c = new Cart();
c.Items.Add("Pen"); // allowed: mutating the object
c.Items.Add("Book");
Console.WriteLine("Items: " + c.Items.Count);
}
}Podsumowanie
Typowa klasa używa const dla stałych literałów oraz readonly dla wartości ustalanych dla danej instancji podczas jej tworzenia.
using System;
class Account
{
public const decimal MinBalance = 0m;
public readonly string Owner;
public Account(string owner)
{
Owner = owner;
}
}
class Program
{
static void Main()
{
var a = new Account("Rin");
Console.WriteLine(a.Owner + " min=" + Account.MinBalance);
}
}Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat różnic między const a readonly.
Podsumowanie
const to literał ustalany podczas kompilacji, który jest niejawnie statyczny i wstawiany do kodu wywołującego. readonly jest ustawiane raz przy deklaracji lub w konstruktorze i może korzystać z wartości dostępnych w czasie działania programu. Używaj const dla rzeczywistych literałów, static readonly dla współdzielonych wartości obliczanych w czasie działania programu i pamiętaj, że readonly blokuje referencję, a nie obiekt.
using System;
class Demo
{
public const int Max = 100;
public readonly int Created;
public Demo(int c) { Created = c; }
}
class Program
{
static void Main()
{
var d = new Demo(7);
Console.WriteLine(Demo.Max + ", " + d.Created);
}
}Często zadawane pytania
Czy lekcja „Stałe i pola readonly” jest bezpłatna?
Tak — pełny tekst „Stałe i pola readonly” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Stałe i pola readonly”?
Rozróżniaj const od static readonly. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C# Academy?
Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Stałe i pola readonly”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?
Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Metody i pola statyczne
- Klasy statyczne do celów pomocniczych
- Stałe i pola readonly
- Projektowanie statyczne a instancje