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.
Importante |
---|
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.
Importante |
---|
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
Aggiunta di valori a enumerazioni
Altre risorse
Linee guida di progettazione dei tipi
Linee guida di progettazione per lo sviluppo di librerie di classi