Domanda

Gli enumeri di C # sono dattiloscritti?

In caso contrario, quali sono le implicazioni?

È stato utile?

Soluzione

Per dare una risposta leggermente diversa ... mentre i valori sono sicuri per il tipo dal punto di vista del casting, sono ancora deselezionati una volta che sono stati espressi, ad esempio

enum Foo { A = 1, B = 2, C = 3 }    
static void Main()
{
    Foo foo = (Foo)500; // works fine
    Console.WriteLine(foo); // also fine - shows 500
}

Per questo motivo, dovresti controllare i valori, ad esempio con un default in un switch che genera un'eccezione.

Puoi anche controllare (per valori non [Flags] ) tramite:

bool isValid = Enum.IsDefined(typeof(Foo), foo);

Altri suggerimenti

Sì, lo sono.

Quanto segue proviene da http://www.csharp-station.com/Tutorials /Lesson17.aspx

Gli enum sono costanti fortemente tipizzate. Sono essenzialmente tipi unici che ti consentono di assegnare nomi simbolici a valori integrali. Nella tradizione C #, sono fortemente tipizzati, il che significa che un enum di un tipo non può essere assegnato implicitamente a un enum di un altro tipo anche se il valore sottostante dei loro membri è lo stesso. Sulla stessa linea, tipi ed enumerazioni integrali non sono implicitamente intercambiabili. Tutti i compiti tra diversi tipi di enum e tipi integrali richiedono un cast esplicito.

Per coloro che suggeriscono di usare Enum.IsDefined per fare la validazione degli argomenti ... no! Per Brad Abrams (dal Aggiornamento delle linee guida per la progettazione di Enum Design ):

  

Esistono davvero due problemi con Enum.IsDefined (). Prima carica la riflessione e un mucchio di metadati di tipo freddo che lo rendono una chiamata ingannevolmente costosa. In secondo luogo, poiché la nota allude a un problema di versione qui.

Sì, lo sono .

  

Gli enum sono costanti fortemente tipizzate.   Sono essenzialmente tipi unici che   consente di assegnare nomi simbolici a   valori integrali. Nella tradizione C #,   sono fortemente tipizzati, nel senso che   un enum di un tipo potrebbe non esserlo   implicitamente assegnato a un enum di   un altro tipo anche se il   valore sottostante dei loro membri sono   lo stesso. Sulla stessa linea,   tipi integrali ed enumerazioni non lo sono   implicitamente intercambiabile. Tutti   incarichi tra enum differenti   tipi e tipi integrali richiedono un   cast esplicito.

Sì.

C #: tipi di enum:

-Enumerazione sicura dei tipi di valori nominati.

-Evita gli errori di programmazione

-L'utente può controllare il tipo sottostante (il valore predefinito è int)

-Può anche controllare i valori sottostanti

Tecnicamente no perché puoi rappresentare un Enum come valore base (int, long, ecc.). Tuttavia, se si garantisce di utilizzare l'enum solo con i nomi forniti, si riceveranno errori di compilazione se si modifica il nome di un valore elencato senza aggiornare i suoi riferimenti. A questo proposito sì, è sicuro.

Sono in ritardo alla festa qui, ma volevo aggiungere qualcosa in più ... Un aggiornamento a . NET Framework Design Guidelines da Krzysztof Cwalina. Oltre all'eccellente suggerimento sopra riportato sul controllo per garantire che un valore valido venga passato ai tuoi Enum, questo fornisce altre indicazioni e consigli su come usarli in modo efficace, un gruppo di gotcha (in particolare gli enum Flags ) , ecc.

sì, sono tipizzati in modo sicuro non è possibile che non esegua la conversione impilcita delle variabili costanti enum in valore intero u hv 2 esegui esplicitamente dat per esempio enum days { sole, mon } int e = (int) days.sun; Console.WriteLine (e);

Gli enumerati C # sono di tipo sicuro

  1. Non è possibile convertire implicitamente dal tipo sottostante in enum effettivo
  2. Inoltre, non è possibile assegnare un valore di un enum a un altro enum, anche se i tipi sottostanti di entrambi gli enum sono uguali. È sempre richiesto un cast esplicito.
  3. Enum rende il tuo codice più leggibile e più gestibile.

Sono arrivato attraverso un eccellente video tutorial sugli enum che esalta il loro tipo di natura sicura. Dai un'occhiata qui e .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top