2008-09-12 6 views

답변

40

나는 당신이 원하는 것이 깃발 유형 열거 형이라고 믿습니다.

열거 형의 맨 위에 Flags 특성을 추가해야합니다. 그러면 열거 형을 'Or'키워드와 결합 할 수 있습니다. 이처럼

:

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

참고 : 오른쪽 숫자는 항상 두 배 큰 (2의 거듭 제곱)입니다 -이 설정되어있는 개별 플래그를 분리 할 수 ​​있도록 필요합니다.

는 OR 키워드를 사용하여 원하는 플래그를 결합 :

설정되어 있는지 확인하려면 열거에

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

이 제목 표시 줄 및 읽기 전용으로 설정을 :

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

좋은 답변입니다. (Jonas Follesø가 그의 답변에서 지적한대로)이 키의 핵심은 Enum 값을 2의 제곱 (1,2,4,8,16 등)으로 사용하는 것입니다. – Andrew

+11

.NET 4를 사용하면 .HasFlag 메서드를 사용하여 코드를 좀 더 읽기 쉽게 만들 수 있습니다. - settings.HasFlag (CombinationEnums.TitleBar) 그렇다면 –

0

enum flags()를 사용하는 경우 유용한 문서 here이 있습니다.

1

질문을 올바르게 이해하면 다른 열거 형을 결합하고 싶습니다. 따라서 하나의 변수는 두 개의 서로 다른 열거 형 중 하나의 값을 저장할 수 있습니까? 하나의 열거 형의 두 가지 다른 값을 결합하여 저장하는 방법에 대해 묻는다면 Dave Arkell의 설명을 볼 수 있습니다.

열거 형은 일부 구문 설탕과 정수입니다. 따라서 중복이 없는지 확인하려면 int로 캐스팅하여 결합 할 수 있습니다.

예쁜 코드는 만들 수 없습니다. 나는 enum을 사용하는 것을 피하려고 노력한다. 일반적으로 enum이 코드에서 번식하게하면 반복되는 case 문과 다른 지저분한 반 패턴이 생기기 전에 시간 문제 일뿐입니다.

1

Enum의 조합 키는 비트 연산 (|=&=)을 수행 할 수 있도록 값이 2의 제곱수 (1, 2, 4, 8 등)인지 확인하는 것입니다. 이러한 EnumFlags 속성으로 태그를 지정할 수 있습니다. Windows Forms 컨트롤의 Anchor 속성은 이러한 컨트롤의 예입니다. 플래그로 표시된 경우 Visual Studio에서는 속성 디자이너의 드롭 다운에서 하나를 선택하는 대신 값을 확인할 수 있습니다.

+3

2의 제곱수 : 1 = 2^0을 잊지 마세요! –

+0

"none"에 0 값을 제공하는 것도 좋습니다. – Nyerguds

3

당신은있는 FlagsAttribute 사용할 수 있습니다 열거 형을 조합하여 Enum을 결합하게합니다.

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

그리고 그렇게 (클래스 UserPriviltes)처럼 전화 :

Public Sub New (_ 
    options As SecurityRights _ 
) 

New UserPrivileges(SecurityRights.Read OR SecurityRights.Execute) 
위의 사용자가 모두 읽기를 가지고 있으며, 모두 하나의 공상 SecurityRights 변수에 다닐 실행하도록 효과적으로 (비트 연산) 결합되는

.

//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, 타일러 :

하면 사용자는 당신이 확인하고있는 사용자에게 열거 값을 열거 값을 확인하기 위해 사용 권한 및 (더 비트 수학)이 있는지 확인하려면

+0

BitVector32를 사용하지 않는 이유는 무엇입니까? – Maslow

+0

@abatishchev 기사에서 얻은 내용이 아닙니다. '플래그 열거 형의 제로 값에 이름을 지정하십시오. 없음 '...'값은 항상 모든 플래그가 지워 져야 함을 의미합니다. ' 그것이 말하는 것은 0을 사용하여 어떤 추가 상태를 의미하지 말아야한다는 것입니다. 0은 상태가 없음을 의미합니다 (즉, '없음'). –

+0

-1. 의 사용을 망쳐 놓았습니다. 2의 값을 설정하지 마십시오. .NET은 마술처럼 충돌하지 않도록 예제에서 비트 패턴 "1"과 "3"을 발생시키지 않습니다. – ToolmakerSteve