2008-09-12 10 views

Odpowiedz

40

Wierzę, że to, czego chcesz, to wyliczenie typu flagi.

Musisz dodać atrybut Flags u góry wyliczenia, a następnie połączyć wyrazy z słowem kluczowym "Or".

Jak to:

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

Uwaga: Liczby po prawej stronie są zawsze dwa razy większy (potęgi 2) - jest to potrzebne, aby móc oddzielić poszczególne flagi, które zostały określone.

Kombajny żądane flagi za pomocą słowa kluczowego, czyli

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

Ustawia pasku tytułowym i tylko do odczytu do wyliczenia

Aby sprawdzić, co zostało ustawione:

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

Świetna odpowiedź. W przypadku, gdy nie jest to od razu oczywiste (jak zauważa Jonas Follesø w swojej odpowiedzi) - kluczem do tego jest użycie wartości Enum do potęgi 2 (1,2,4,8,16, itp.). – Andrew

+11

Jeśli jesteś za pomocą .NET 4, możesz użyć metody .HasFlag, aby kod był trochę łatwiejszy do odczytania - Jeśli ustawienia.HasFlag (CombinationEnums.TitleBar) Następnie bla bla –

0

Jeśli podejmujesz temat używania znaczników enum(), istnieje dobry artykuł here.

1

Jeśli dobrze rozumiem twoje pytanie, chcesz połączyć różne typy wyliczeniowe. Tak więc jedna zmienna może przechowywać wartość z jednego z dwóch różnych praw wyliczeniowych? Jeśli pytasz o przechowywanie łączące dwie różne wartości jednego typu wyliczeniowego, możesz spojrzeć na wyjaśnienia Dave'a Arkell'a:

Wyliczenia są po prostu liczbami całkowitymi z pewnymi cukrami syntaktycznymi. Jeśli więc upewnisz się, że nie ma nakładania, możesz je połączyć, przesyłając do int.

Nie spowoduje to jednak ładnego kodu. Staram się unikać używania wyrażeń przez większość czasu. Zwykle, jeśli pozwolisz, aby wyliczenia były w twoim kodzie, to tylko kwestia czasu, zanim narodzą się powtarzające się przypadki i inne niechlujne antypatie.

1

Kluczem do kombinacji Enum s jest, aby upewnić się, że wartość jest potęgą liczby dwa (1, 2, 4, 8, etc.), dzięki czemu można wykonywać operacje bitowe na nich (|=&=). Te Enum s można oznaczyć za pomocą atrybutu Flags. Właściwość Anchor w formantach Windows Forms jest przykładem takiej kontroli. Jeśli jest oznaczony flagą, Visual Studio pozwoli ci sprawdzić wartości zamiast wybierać jedną z rozwijanej listy w projektancie właściwości.

+3

Potęga dwóch: nie zapomnij 1 = 2^0! –

+0

Zawsze dobrze jest podać wartość 0 dla "none". – Nyerguds

3

Można użyć FlagsAttribute ozdobić taką Enum, która pozwoli ci połączyć Enum:

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

a następnie wywołać je jak SO (UserPriviltes klasa):

Public Sub New (_ 
    options As SecurityRights _ 
) 

New UserPrivileges(SecurityRights.Read OR SecurityRights.Execute) 

one skutecznie się łączyć (bit matematyka), tak że powyższy użytkownik ma zarówno odczytu i wykonywania wszystkich nosić w jednej zmiennej fantazyjne SecurityRights.

Aby sprawdzić, czy użytkownik ma przywilej używać AND (więcej bitowe matematyki), aby sprawdzić użytkownikom wartość enum z wartości Enum jesteś sprawdzanie:

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

dlaczego nie użyć BitVector32? – Maslow

+0

@abatishchev To nie jest to, co otrzymałem z artykułu. 'Wpisz nazwę zerową wyliczeń flag None' ...' wartość musi zawsze oznaczać, że wszystkie flagi zostały wyczyszczone'. Mówi się, że nie należy używać zera do określenia jakiegoś dodatkowego stanu, a raczej zero oznacza brak stanu (tj. "Brak"). –

+0

-1. Zniszczyłeś użycie , ustawiając wartości, które NIE SĄ POWERS OF 2.NET nie powoduje magicznych wzorców bitowych "1" i "3" w twoim przykładzie, aby nie kolidować. – ToolmakerSteve