Capisco che le enumerazioni siano compilate come costanti, quindi cambiandole si ottiene un cambio di rottura. Quello che mi chiedo è perché non sono stati compilati Enum allo stesso modo in cui sono statiche le variabili readonly?Perché gli Enum sono stati compilati come costanti anziché come valori statici?
risposta
Possono essere più efficienti dei campi, quindi non è necessario compilarli nello stesso modo quando possono essere incorporati direttamente nell'IL.
[Enum] vengono caricati nello stesso modo con cui viene caricato il valore const. Sono incorporati direttamente nel IL . I campi, d'altra parte, richiedono un'istruzione di carico sul campo (ldsfld) che influirà in qualche modo sulle prestazioni. Le enumerazioni sono quindi altrettanto veloci di const nell'uso tipico; i campi sono un po 'più lenti.
(Source)
Ok, quindi è stata una decisione basata sulle prestazioni. Questo è esattamente quello che stavo cercando ... la risposta al "Perché?". –
Proprio come con qualsiasi costante, tutti i riferimenti a singoli valori di un'enumerazione vengono convertiti in valori numerici in fase di compilazione
Quindi mi manca qualcosa?
Sì. La domanda era: "Perché vengono compilati come costanti anziché come readonlys statici?" ... Fondamentalmente, quale è stata la decisione di progettazione di renderli costanti letterali invece di readonlys statico? –
@my, Se non sbaglio readonly può essere impostato su Instantiation, e non è lo stesso di costanti che non possono essere impostate su Instantiation –
Entrambe le risposte fornite sono tecnicamente corrette ma mancano le spiegazioni per le costanti differantianti con statica (in sola lettura). In C#, costanti sono sempre più veloce di sola lettura e il motivo è molto semplice e esprime al meglio con un piccolo esempio di codice:
const int MyConstant = 10;
static readonly int MyReadonly = 20;
static void Main()
{
int result = MyConstant + MyReadonly;
// the above statement will be resolved to:
// int result = 10 + MyReadonly
}
In fase di compilazione, il compilatore sostituisce tutti i riferimenti a una costante con il valore effettivo di tale costante . È in grado di farlo perché una costante deve essere predefinita al momento della compilazione. Questo differisce dai valori statici di readonly che, sebbene statici, sono effettivamente risolti in fase di runtime. Prendiamo il seguente esempio:
static readonly Encoding = Encoding.GetEncoding("GB2132");
v'è alcun modo per il compilatore per sapere se GB2132 esiste realmente sulla macchina su cui questo codice è destinato per l'esecuzione. L'unico modo per risolvere questo valore è in fase di runtime. Statico assicura che il valore stesso non sia vincolato alla durata di un'istanza e garantisce solo che il valore può essere impostato una sola volta. Non c'è modo per il compilatore di sostituire i riferimenti a questo campo in fase di compilazione poiché il valore semplicemente non può essere conosciuto.
Logicamente, solo i tipi primitivi possono essere contrassegnati come costanti.
Ora in caso di enumerazione, è molto semplice. Le enumerazioni non sono altro che valori interi con un'etichetta. Così il seguente codice:
enum MyEnum
{
First,
Second,
Third
}
static void Main()
{
MyEnum test = MyEnum.First;
if (test == MyEnum.Second)
{
// whatever
}
}
sarà risolta dal compilatore per:
const int MyEnum_First = 0;
const int MyEnum_Second = 1;
const int MyEnum_Third = 2;
static void Main()
{
int test = MyEnum_First;
if (test == MyEnum_Second)
{
// whatever
}
}
che a sua volta significa che i riferimenti effettivi ai campi costanti può essere sostituito con il valore noto al momento della compilazione, rendendo la versione finale del codice:
static void Main()
{
int test = 0;
if (test == 1)
{
// whatever
}
}
Spiegazione impressionante, tizio – ivowiblo
Sì, ma la domanda non era il motivo per cui Enums sta cambiando i cambiamenti, ma perché Microsoft ha scelto di compilarli come costanti anziché come campi statici di sola lettura. Avrebbero potuto fare in modo che il compilatore andasse in entrambi i modi, la domanda era: perché andavano con le costanti, invece, quando quello sarebbe stato un cambiamento decisivo, e qualcuno l'ha risposto ... semplicemente per i guadagni in termini di prestazioni. –
- 1. Perché utilizzare enum anziché costanti?
- 2. Gli esempi a cascata non sono stati compilati?
- 3. perché utilizzare costanti stringa vs costanti enum?
- 4. Come avere valori enum con gli spazi?
- 5. Come definire i valori costanti - Best Practice
- 6. Perché Phobos usa enum per le costanti?
- 7. Come si modellano gli stati dell'applicazione?
- 8. C# Enum o costanti int
- 9. Perché gli array cost di Pascal non sono effettivamente costanti?
- 10. Classe con valori costanti statici definiti in Objective-C
- 11. Perché non sono permessi i flo statici?
- 12. Un enum può avere costruttori per ciascuna delle sue costanti
- 13. come confrontare valori enum
- 14. Espressioni costanti da un Enum
- 15. #define vs enum in un ambiente incorporato (come vengono compilati?)
- 16. I file CSS non sono stati compilati in app.css come previsto in Ember CLI?
- 17. Gli attributi personalizzati per Enum sono pericolosi?
- 18. Come sono stati analizzati `: ~ @` e `:! @`?
- 19. Come localizzare gli UIApplicationShortcutItems statici?
- 20. Gli oggetti statici sono univoci per utente?
- 21. Quali sono gli stati del thread Dalvik?
- 22. Come definire le costanti statiche in un enum Java?
- 23. AngularJS: costanti vs valori
- 24. Java: perché Thread.sleep() e yield() sono statici?
- 25. perché le costanti java sono dichiarate statiche?
- 26. Perché l'inizializzazione delle costanti enum Java non è completa?
- 27. Come verificare quali passaggi sono stati utilizzati
- 28. Perché le funzioni incorporate di PHP utilizzano le costanti anziché solo le stringhe come parametri?
- 29. Perché i valori stringa sono l-valore mentre tutti gli altri valori letterali sono valore-r?
- 30. Come estendere anziché sostituire gli stili WPF
I valori di enumerazione non possono essere modificati in fase di esecuzione nello stesso modo in cui non è possibile.Se fossero statici ciò implicherebbe che il loro valore potrebbe cambiare. –