Element zadeklarowany jako readonly daje możliwość zmiany w (statycznym) konstruktorze klasy, podczas gdy element const nie może zostać zmieniony w czasie wykonywania.
Stwierdzenie pole jako const powoduje automatycznie statyczne cytuje §10.3.7:
Gdy pole, sposób, własności zdarzenie operator lub konstruktora zgłoszenie zawiera statyczny modyfikator deklaruje statyczny członek. Ponadto deklaracja stała lub typu jawnie deklaruje element statyczny o wartości .
Trzeci jest tylko właściwością tylko do odczytu, co dzieje się zawsze powrócić 5.
Nigdy nie należy używać taką właściwość i wolą członków const gdzie to możliwe, w celu umożliwienia kompilator i/lub drgania aby dokonać optymalizacji i pomóc innym osobom odczytać twój kod (ta własność jest dla mnie czymś w rodzaju WTF). Statyczny element tylko do odczytu musi być użyty, jeśli wymagana jest stała wartość zainicjowana podczas uruchamiania programu (jak na przykład liczba rdzeni maszyny).
Jest to doskonały przykład ze specyfikacją # C (§10.5.2.1)
statycznego pola tylko do odczytu, jest przydatny, gdy pożądane jest symboliczną nazwą stałej wartości , ale gdy typ wartość nie jest dozwolona w deklaracji const lub gdy nie można obliczyć wartości na podczas kompilacji.W przykładzie
public class Color
{
public static readonly Color Black = new Color(0, 0, 0);
public static readonly Color White = new Color(255, 255, 255);
public static readonly Color Red = new Color(255, 0, 0);
public static readonly Color Green = new Color(0, 255, 0);
public static readonly Color Blue = new Color(0, 0, 255);
private byte red, green, blue;
public Color(byte r, byte g, byte b) {
red = r;
green = g;
blue = b;
}
}
Czarny, biały, czerwony, zielony i niebieski członkowie nie mogą być zadeklarowane jako const członków, ponieważ ich wartości nie mogą być obliczane w czasie kompilacji. Jednak deklarowanie ich jako statycznych tylko do odczytu ma ten sam efekt .
I jeszcze jedna różnica (§10.5.2.2):
Stałe i pola readonly mają różne wersjonowania binarny semantykę. Gdy wyrażenie odwołuje się do stałej, wartość stałej jest uzyskiwana podczas kompilacji, ale gdy wyrażenie odwołuje się do pola tylko do odczytu, wartość pola nie jest uzyskiwana do czasu wykonania .
Podsumowując, są bardzo różne, nawet jeśli na pierwszy rzut oka mogą wyglądać podobnie i powinieneś użyć tego, który najlepiej pasuje do twojego zamiaru.
To nie odpowiada na pytanie. – AgentFire