Condividi tramite


Progettazione di enumerazioni Flags

Le enumerazioni Flags vengono utilizzate per mascherare campi di bit ed eseguire confronti bit per bit. Rappresentano la scelta di progettazione corretta quando è possibile specificare contemporaneamente più valori di enumerazione. È ad esempio possibile combinare qualsiasi valore di enumerazione GenericUriParserOptions per configurare un parser URI (Uniform Resource Identifier) generico.

Applicare l'attributo System.FlagsAttribute alle enumerazioni Flags, non a quelle semplici.

Utilizzare la potenza di due per i valori di un'enumerazione Flags affinché possano essere combinati liberamente mediante un'operazione OR bit per bit.

Nota importanteImportante

Se non si utilizza la potenza di due, oppure combinazioni della potenza di due, le operazioni bit per bit non funzioneranno come previsto.

Valutare l'opportunità di fornire valori di enumerazione speciali per le combinazioni di flag utilizzate di frequente.

La combinazione di valori di enumerazione Flags è un'attività di difficoltà intermedia che non è normalmente richiesta agli sviluppatori che implementano scenari comuni. Ad esempio, l'enumerazione FileShare contiene il valore ReadWrite per indicare che un file condiviso può essere aperto per la lettura o la scrittura. In questo modo, gli sviluppatori non hanno la necessità di specificare una combinazione di valori di enumerazione come un unico valore.

Evitare di creare enumerazioni Flags quando determinate combinazioni di valori non sono valide.

Questo problema indica in genere che il significato dell'enumerazione non è sufficientemente preciso. Valutare l'opportunità di suddividere l'enumerazione in due o più enumerazioni, ciascuna con un insieme di valori più preciso. Si consideri ad esempio la seguente enumerazione, caratterizzata da una definizione non abbastanza precisa.

<Flags()> _
Public Enum PurchaseTypes

    SalePrice
    RegularPrice
    Book
    CompactDisk

End Enum

[Flags]
public enum PurchaseTypes
{
    SalePrice,
    RegularPrice,
    Book,
    CompactDisk
}

In base all'intento di progettazione, questa enumerazione deve essere utilizzata con il seguente metodo.

Public Overloads Function FindPriceForItem(ByVal title As String, ByVal purchase As PurchaseTypes) As Single
    Return 0
End Function
public float FindPriceForItem(string title, PurchaseTypes purchase)

Quando questo metodo viene chiamato, il parametro purchase specifica esattamente uno dei valori SalePrice o RegularPrice e uno dei valori Book o CompactDisk. Gli sviluppatori non sarebbero in grado di determinare questo requisito senza consultare la documentazione o sperimentare il metodo. Un approccio più efficace consiste nel separare i due tipi di informazione, inserendo ciascuno di essi in un'enumerazione specifica, come illustrato nel seguente esempio di codice.

Public Enum ItemType

    Book
    CompactDisk

End Enum

Public Enum PriceType

    SalePrice
    RegularPrice

End Enum

public enum ItemType
{
    Book,
    CompactDisk
}

public enum PriceType
{
    SalePrice,
    RegularPrice,
}

In questo caso, la firma del metodo cambierebbe in modo da riflettere questa modifica di progettazione, come illustrato nel seguente esempio di codice.

Public Overloads Function FindPriceForItem(ByVal title As String, ByVal name As ItemType, ByVal price As PriceType) As Single
    Return 0
End Function
public float FindPriceForItem(string title, ItemType name, PriceType price)

Evitare di impostare su zero un valore di enumerazione Flags, a meno che il valore non venga utilizzato per indicare che tutti i flag sono cancellati. A tale valore dovrebbe essere assegnato un nome appropriato, come descritto nella linea guida successiva.

Si noti che questa linea guida è valida solo per le enumerazioni Flags. Per quelle semplici è possibile e opportuno utilizzare il valore zero.

Non assegnare il nome None al valore zero delle enumerazioni Flags. Per le enumerazioni di questo tipo, il nome del valore deve sempre indicare che tutti i flag sono cancellati.

Nota importanteImportante

Non utilizzare il valore zero in un'enumerazione Flags per indicare qualsiasi altro stato.Non è possibile verificare la presenza di un flag con valore zero impostato esplicitamente, diversamente dal caso in cui non sono impostati flag.

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

Aggiunta di valori a enumerazioni

Altre risorse

Linee guida di progettazione dei tipi

Linee guida di progettazione per lo sviluppo di librerie di classi