2008-09-12 15 views

Antwort

40

Ich glaube, was Sie wollen, ist ein Flag Typ Enum.

Sie müssen das Flags-Attribut oben in der Enumeration hinzufügen, und anschließend können Sie Enums mit dem Schlüsselwort 'Or' kombinieren.

So:

<Flags()> _ 
Enum CombinationEnums As Integer 
    HasButton = 1 
    TitleBar = 2 
    ReadOnly = 4 
    ETC = 8 
End Enum 

Hinweis: Die Zahlen auf der rechten Seite sind immer doppelt so groß (Potenzen von 2) - dies wird benötigt, um die einzelnen Fahnen zu trennen, die gesetzt wurden.

die gewünschten Flags Kombinieren Sie die Oder Schlüsselwort:

Dim settings As CombinationEnums 
settings = CombinationEnums.TitleBar Or CombinationEnums.Readonly 

Dies setzt TitleBar und Read-Only in die Enum

Um zu überprüfen, was festgelegt worden ist:

If (settings And CombinationEnums.TitleBar) = CombinationEnums.TitleBar Then 
    Window.TitleBar = True 
End If 
+0

Große Antwort. Für den Fall, dass es nicht sofort offensichtlich ist, (wie Jonas Follesø in seiner Antwort darauf hinweist) - der Schlüssel dazu ist die Verwendung von Enum-Werten mit der Potenz 2 (1,2,4,8,16, usw.) – Andrew

+11

Wenn Sie es sind mit .NET 4, dann können Sie die .HasFlag-Methode verwenden, um den Code ein wenig leichter zu lesen - Wenn settings.HasFlag (CombinationEnums.TitleBar) Dann bla bla –

0

Wenn Sie über enum flags() verwenden, gibt es einen guten Artikel here.

1

Wenn ich Ihre Frage richtig verstehe, möchten Sie verschiedene Aufzählungstypen kombinieren. Also kann eine Variable einen Wert von einem von zwei verschiedenen Enum-Rechten speichern? Wenn Sie nach dem Speichern von zwei verschiedenen Werten eines Enum-Typs fragen, können Sie sich Dave Arkells Erklärung ansehen

Enums sind nur ganze Zahlen mit etwas syntaktischem Zucker. Wenn Sie also sicherstellen, dass es keine Überlappung gibt, können Sie sie kombinieren, indem Sie nach int umwandeln.

Es wird nicht für schönen Code obwohl. Ich versuche zu vermeiden, Enums die meiste Zeit zu verwenden. Normalerweise ist es nur eine Frage der Zeit, bis Sie wiederholte Fälle und andere unordentliche Antipattern zur Welt bringen.

1

Der Schlüssel zur Kombination Enum s ist, um sicherzustellen, dass der Wert eine Potenz von zwei (1, 2, 4, 8, etc.), so dass Sie Bit-Operationen auf sich ausführen können (|=&=). Diese Enum s können mit einem Flags Attribut gekennzeichnet werden. Die Anchor-Eigenschaft für Windows Forms-Steuerelemente ist ein Beispiel für ein solches Steuerelement. Wenn es als Flag gekennzeichnet ist, können Sie in Visual Studio Werte überprüfen, anstatt einen einzelnen im Drop-down-Menü des Eigenschafts-Designers auszuwählen.

+3

Zweierpotenzen: nicht vergessen 1 = 2^0! –

+0

Es ist auch immer schön, einen Wert von 0 für "none" anzugeben. – Nyerguds

3

Sie können die Flags verwenden um ein Enum so zu dekorieren, dass Sie das Enum kombinieren können:

<FlagsAttribute> _ 
Public Enumeration SecurityRights 
None = 0 
Read = 1 
Write = 2 
Execute = 4 

Und dann sie wie so nennen (Klasse UserPriviltes):

Public Sub New (_ 
    options As SecurityRights _ 
) 

New UserPrivileges(SecurityRights.Read OR SecurityRights.Execute) 

Sie effektiv kombiniert bekommen (Bitmathematik), so dass der oben Benutzer sowohl Lese- und rundum Security in einer Phantasie Variable durchführen.

Um zu überprüfen, um zu sehen, ob der Benutzer ein Privileg Sie verwenden hat AND (mehr bitweise Mathematik) mit den Mitglieder ENUM-Wert mit dem der Enum-Wert überprüfen Sie überprüfen für:

//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

+0

Warum nicht ein BitVector32 verwenden? – Maslow

+0

@abatiishchev Das ist nicht, was ich von dem Artikel bekommen habe. 'Nennen Sie den Nullwert von Flag-Enumerationen None' ...' der Wert muss immer bedeuten, dass alle Flags gelöscht sind'. Was es sagt ist, dass Sie nicht Null verwenden sollten, um einen zusätzlichen Zustand zu meinen, sondern dass Null keinen Zustand bedeutet (d. H. "Keiner"). –

+0

-1. Sie haben die Verwendung von ruiniert, indem Sie Werte gesetzt haben, die NICHT 2-POWERS sind. Net führt nicht dazu, dass die Bitmuster "1" und "3" in Ihrem Beispiel nicht kollidieren. – ToolmakerSteve