Condividi tramite


Progettazione di enumerazioni

Le enumerazioni forniscono insiemi di valori costanti che risultano utili per i membri fortemente tipizzati e migliorano la leggibilità del codice. Le enumerazioni possono essere semplici o Flags. Le enumerazioni semplici contengono valori che non vengono combinati né utilizzati in confronti bit per bit. Le enumerazioni Flags sono destinate a essere combinate mediante operazioni OR bit per bit. Le combinazioni di valori di enumerazione Flags vengono esaminate mediante operazioni AND bit per bit.

Nelle seguenti linee guida vengono descritte le procedure consigliate per la progettazione di enumerazioni.

Utilizzare un'enumerazione per tipizzare fortemente parametri, proprietà e valori restituiti che rappresentano insiemi di valori.

Favorire l'utilizzo di un'enumerazione in alternativa a costanti statiche.

Nel codice riportato di seguito è illustrato un esempio di progettazione non corretta.

Public Class BadFurnishings

    Public Shared Table As Integer = 1
    Public Shared Chair As Integer = 2
    Public Shared Lamp As Integer = 3

End Class
public static class BadFurnishings
{
    public static int Table = 1;
    public static int Chair = 2;
    public static int Lamp = 3;
}

Nell'esempio di codice riportato di seguito è illustrata l'enumerazione da utilizzare in sostituzione delle costanti statiche.

Public Enum GoodFurnishings

    Table
    Chair
    Lamp

End Enum
public enum GoodFurnishings
{
    Table,
    Chair,
    Lamp
}

Non utilizzare un'enumerazione per gli insiemi aperti, ad esempio la versione del sistema operativo.

L'aggiunta di valori a un'enumerazione già fornita può causare un'interruzione nel codice esistente. In alcuni casi questa situazione è accettabile, ma non è consigliabile progettare un'enumerazione che presenti caratteristiche di questo tipo.

Non definire valori di enumerazione riservati per un utilizzo futuro.

In alcuni casi è possibile valutare che l'aggiunta di valori all'enumerazione fornita vale il rischio di una possibile interruzione nel codice esistente. È anche possibile definire una nuova enumerazione e membri che interagiscono con i relativi valori.

Evitare di esporre pubblicamente enumerazioni con un unico valore.

Non includere valori sentinel nelle enumerazioni.

I valori sentinel vengono utilizzati per identificare i limiti dei valori nell'enumerazione. Un valore sentinel viene in genere utilizzato nelle verifiche degli intervalli e non è un valore di dati valido. Nell'esempio di codice riportato di seguito è definita un'enumerazione con un valore sentinel.

Public Enum Furniture

    Desk
    Chair
    Lamp
    Rug
    LastValue

End Enum

public enum Furniture
{
    Desk,
    Chair,
    Lamp,
    Rug,
    LastValue   // The sentinel value.
}

Fornire un valore zero per le enumerazioni semplici.

Se possibile, assegnare il nome None a questo valore. Se None non risulta appropriato, assegnare zero al valore utilizzato più di frequente (predefinito).

Valutare l'opportunità di utilizzare System.Int32 (il tipo di dati predefinito nella maggior parte dei linguaggi di programmazione) come tipo di dati sottostante di un'enumerazione a meno che non sia vera una delle seguenti affermazioni:

  • L'enumerazione è di tipo Flags e sono presenti più di 32 flag, oppure si prevede che il numero di flag aumenti in futuro.

  • Il tipo sottostante deve essere diverso da Int32 per una più facile interoperabilità con il codice non gestito in cui sono previste enumerazioni di dimensione differente.

  • Un tipo sottostante più piccolo determina un risparmio di spazio sostanziale. Se si prevede che un'enumerazione venga utilizzata principalmente come argomento per il flusso di controllo, l'importanza della dimensione è poco rilevante. Il risparmio di spazio può essere significativo se:

    • Si prevede che l'enumerazione venga utilizzata come campo in una classe o una struttura per la quale vengono create istanze molto di frequente.

    • Si prevede che vengano create matrici o insiemi di istanze di enumerazione di grandi dimensioni.

    • Si prevede che venga serializzato un numero elevato di istanze dell'enumerazione.

Per le enumerazioni Flags utilizzare nomi o locuzioni nominali al plurale. Per le enumerazioni semplici preferire la forma singolare.

Non estendere direttamente System.Enum.

Alcuni compilatori non consentono l'estensione di Enum a meno che questa operazione non venga eseguita indirettamente mediante la parola chiave per la generazione di enumerazioni specifica del linguaggio.

Portions Copyright 2005 Microsoft Corporation. Tutti i diritti riservati.

Portions Copyright Addison-Wesley Corporation. Tutti i diritti riservati.

Per ulteriori informazioni sulle linee guida di progettazione, vedere “le linee guida di progettazione di Framework: Idiomi convenzioni, e modelli per libro raccolte riutilizzabili .NET„ di Krzysztof Cwalina e brad Abrams, emessi da Addison-Wesley, 2005.

Vedere anche

Concetti

Progettazione di enumerazioni Flags

Aggiunta di valori a enumerazioni

Altre risorse

Linee guida di progettazione dei tipi

Linee guida di progettazione per lo sviluppo di librerie di classi