Combinazione di enumerazioni
Domanda
C'è un modo per combinare Enumerazioni in VB.net?
Soluzione
Credo che quello che vuoi sia un'enumerazione di tipo flag.
Devi aggiungere l'attributo Flags all'inizio dell'enumerazione, quindi puoi combinare le enumerazioni con la parola chiave "Or".
Come questo:
<Flags()> _
Enum CombinationEnums As Integer
HasButton = 1
TitleBar = 2
ReadOnly = 4
ETC = 8
End Enum
Nota: I numeri a destra sono sempre due volte più grandi (potenze di 2): ciò è necessario per poter separare i singoli flag impostati.
Combina i flag desiderati utilizzando la parola chiave Or:
Dim settings As CombinationEnums
settings = CombinationEnums.TitleBar Or CombinationEnums.Readonly
Questo imposta TitleBar e Readonly nell'enumerazione
Per verificare cosa è stato impostato:
If (settings And CombinationEnums.TitleBar) = CombinationEnums.TitleBar Then
Window.TitleBar = True
End If
Altri suggerimenti
Puoi utilizzare FlagsAttribute per decorare un Enum in questo modo che ti consentirà di combinare l'Enum:
<FlagsAttribute> _
Public Enumeration SecurityRights
None = 0
Read = 1
Write = 2
Execute = 4
E poi chiamarli così (classe UserPriviltes):
Public Sub New ( _
options As SecurityRights _
)
New UserPrivileges(SecurityRights.Read OR SecurityRights.Execute)
Vengono effettivamente combinati (matematica dei bit) in modo che l'utente di cui sopra abbia sia la lettura che l'esecuzione trasportati in un'unica variabile Security Rights.
Per verificare se l'utente ha un privilegio, utilizza AND (più matematica bit per bit) per controllare il valore enum degli utenti con il valore Enum che stai controllando:
//Check to see if user has Write rights
If (user.Privileges And SecurityRights.Write = SecurityRigths.Write) Then
//Do something clever...
Else
//Tell user he can't write.
End If
Hth, Tyler
Se ho capito bene la tua domanda, vuoi combinare diversi tipi di enumerazione.Quindi una variabile può memorizzare un valore da una delle due diverse enumerazioni, giusto?Se stai chiedendo di memorizzare combinando due valori diversi di un tipo enum, puoi guardare la spiegazione di Dave Arkell
Le enumerazioni sono solo numeri interi con un po' di zucchero sintattico.Quindi, se ti assicuri che non ci siano sovrapposizioni, puoi combinarli trasmettendoli a int.
Tuttavia non sarà un bel codice.Cerco di evitare di utilizzare enumerazioni per la maggior parte del tempo.Di solito, se lasci che le enumerazioni si riproducano nel tuo codice, è solo questione di tempo prima che diano vita a ripetute dichiarazioni di maiuscole e minuscole e altri antipattern disordinati.
La chiave della combinazione Enum
s serve per assicurarsi che il valore sia una potenza di due (1, 2, 4, 8, ecc.) in modo da poter eseguire operazioni bit su di essi (|=
&=
).Quelli Enum
s può essere taggato con a Flags
attributo.IL Anchor
La proprietà sui controlli Windows Form è un esempio di tale controllo.Se è contrassegnato come flag, Visual Studio ti consentirà di controllare i valori invece di selezionarne uno singolo in un elenco a discesa nella finestra di progettazione delle proprietà.
Se stai pensando di usare enum flags() c'è un buon articolo Qui.