Usare enumerazioni per rappresentare costanti denominate in C#

Completato

Si supponga di lavorare su un progetto per tenere traccia degli stati degli ordini ed è necessario organizzare valori come "In sospeso", "Spedito" o "Recapitato" in modo chiaro e gestibile. L'uso di enumerazioni in C# consente di creare un elenco di questi stati degli ordini. L'uso di enumerazioni semplifica l'uso di questi stati nel progetto senza ricrearli o cercarli ripetutamente.

Descrivere uno scenario per le enumerazioni e il valore delle enumerazioni

Le enumerazioni sono ideali per rappresentare un set di valori predefiniti che si escludono a vicenda o possono essere combinati. Ad esempio, è possibile usare un'enumerazione per definire le stagioni dell'anno:

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

L'esempio di codice illustra come definire un'enumerazione per rappresentare valori che si escludono a vicenda.

Le enumerazioni migliorano la leggibilità del codice sostituendo valori letterali numerici con nomi significativi. Consentono inoltre di impedire l'assegnazione di valori non validi, perché sono consentite solo le costanti definite.

Nota

Le enumerazioni possono anche rappresentare combinazioni di scelte tramite flag di bit, utili per scenari come le autorizzazioni per i file o le opzioni di configurazione.

Definire le enumerazioni

Per definire un'enumerazione in C#, usare la enum parola chiave seguita dal nome dell'enumerazione e dai relativi membri. Ecco un esempio di enumerazione semplice per i giorni della settimana:

enum DaysOfWeek
{
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}

L'esempio di codice illustra come definire un'enumerazione per i giorni della settimana.

Per impostazione predefinita, il tipo sottostante di un'enumerazione è inte i valori iniziano da 0, incrementando di 1 per ogni membro.

Nota

Le enumerazioni sono limitate ai tipi integrali (ad esempio, int, byte, short) e non possono rappresentare valori non integrali come stringhe o decimali.

Impostare i tipi e i valori sottostanti per le enumerazioni

È possibile specificare un tipo integrale sottostante diverso per un'enumerazione e assegnare valori personalizzati ai relativi membri. Per esempio:

enum ErrorCode : ushort
{
    None = 0,
    Unknown = 1,
    ConnectionLost = 100,
    OutlierReading = 200
}

L'esempio di codice illustra come impostare un tipo e valori sottostanti personalizzati per un'enumerazione.

Questa flessibilità consente di allineare i valori di enumerazione con sistemi esterni o requisiti specifici.

Suggerimento

Evitare di usare tipi non integrali come char il tipo sottostante per le enumerazioni, il che può causare un comportamento inaffidabile.

Eseguire conversioni con enumerazioni

Le enumerazioni supportano conversioni esplicite tra i relativi membri e il tipo integrale sottostante. Per esempio:

DaysOfWeek day = (DaysOfWeek)3;
Console.WriteLine(day); // Outputs: Wednesday

L'esempio di codice illustra come eseguire una conversione esplicita da un valore integrale a un'enumerazione.

È possibile convalidare i valori di enumerazione usando il System.Enum.IsDefined metodo :

bool isValid = Enum.IsDefined(typeof(DaysOfWeek), 3);
Console.WriteLine(isValid); // Outputs: True

L'esempio di codice illustra come convalidare un valore di enumerazione usando System.Enum.IsDefined.

Suggerimento

Se il valore non è valido, è possibile gestirlo assegnando un valore predefinito o generando un'eccezione per garantire un utilizzo sicuro.

Applicare le procedure consigliate per la progettazione di enumerazioni

Per progettare enumerazioni in modo efficace:

  • Usare sostantivi singolari per enumerazioni semplici e sostantivi plurali per le enumerazioni di flag.
  • Specificare un valore pari a zero per le enumerazioni semplici, in genere denominate None.
  • Evitare di usare valori speciali o riservati, in quanto possono confondere gli utenti.
  • Usare le potenze di due per le enumerazioni di flag per abilitare le operazioni bit per bit.

Suggerimento

Prendere in considerazione l'aggiunta di metodi di estensione alle enumerazioni per altre funzionalità, ad esempio la convalida o la formattazione.

Implementare enumerazioni con valori e metodi personalizzati

Anche se le enumerazioni non possono contenere direttamente metodi, è possibile aggiungere funzionalità usando i metodi di estensione. Per esempio:

public static class DaysOfWeekExtensions
{
    public static bool IsWeekend(this DaysOfWeek day)
    {
        return day == DaysOfWeek.Saturday || day == DaysOfWeek.Sunday;
    }
}

DaysOfWeek today = DaysOfWeek.Saturday;
Console.WriteLine(today.IsWeekend()); // Outputs: True

L'esempio di codice illustra come usare un metodo di estensione per aggiungere funzionalità a un'enumerazione.

Suggerimento

Usare metodi di estensione per migliorare le enumerazioni senza modificarne la definizione, rendendole più versatili e riutilizzabili.

Esempio pratico: Uso di enumerazioni per gestire gli stati degli ordini

Le enumerazioni vengono spesso usate nelle applicazioni per rappresentare valori predefiniti. Ad esempio, in un'applicazione di e-commerce, è possibile usare un'enumerazione per gestire gli stati degli ordini:

enum OrderStatus
{
    Pending,
    Shipped,
    Delivered,
    Cancelled
}

class Order
{
    public int OrderId { get; set; }
    public OrderStatus Status { get; set; }

    public void UpdateStatus(OrderStatus newStatus)
    {
        Status = newStatus;
        Console.WriteLine($"Order {OrderId} status updated to {Status}");
    }
}

var order = new Order { OrderId = 123, Status = OrderStatus.Pending };
order.UpdateStatus(OrderStatus.Shipped);

In questo esempio viene illustrato come definire un'enumerazione per gli stati degli ordini, usarla in una classe e aggiornare lo stato di un ordine. Aiuta i principianti a vedere come le enumerazioni possono essere applicate in uno scenario reale.

Usando le enumerazioni, è possibile sostituire i valori letterali numerici con nomi significativi, rendendo il codice più intuitivo e più semplice da gestire, consentendo anche conversioni e convalide esplicite per garantire un uso sicuro di queste costanti nei progetti.