본문 바로가기

C#

[ C# ] Enum 결합하여 사용하기

[Flags]

[ Flags 어트리뷰트 ]

해당 어트리뷰트를 이용하면 Enum형을 비트 필드 즉 , 플래그 집합으로 처리 할 수 있다 .

Flags 어트리뷰트를 정의함과 정의안함의 차이는 다음과 같다 .

 // Define an Enum without FlagsAttribute.
   enum SingleHue : short
   {
      None = 0,
      Black = 1,
      Red = 2,
      Green = 4,
      Blue = 8
   };

   // Define an Enum with FlagsAttribute.
   [Flags]
   enum MultiHue : short
   {
      None = 0,
      Black = 1,
      Red = 2,
      Green = 4,
      Blue = 8
   };
   
   // The example displays the following output:
//       All possible combinations of values without FlagsAttribute:
//         0 - None
//         1 - Black
//         2 - Red
//         3 - 3
//         4 - Green
//         5 - 5
//         6 - 6
//         7 - 7
//         8 - Blue
//         9 - 9
// 
//  
//
//       All possible combinations of values with FlagsAttribute:
//         0 - None
//         1 - Black
//         2 - Red
//         3 - Black, Red
//         4 - Green
//         5 - Black, Green
//         6 - Red, Green
//         7 - Black, Red, Green
//         8 - Blue
//         9 - Black, Blue
			(이하 생략)
//

Flags 어트리뷰트의 사용으로 여러 속성을 선택 할 수 있음을 볼 수 있다 .

 

[ 비트 연산자 ]

[ 예시 ]

연산자	연산자의 기능
&	비트단위로 AND 연산을 한다.
|	비트단위로 OR 연산을 한다.
^	비트단위로 XOR 연산을 한다.
~	단항 연산자로서 피연자의 모든 비트를 반전시킨다.
<<	피연산자의 비트 열을 왼쪽으로 이동시킨다.
>>	피연산자의 비트 열을 오른쪽으로 이동시킨다.

 

[ 예시 ]

[ 예시 ]

주의 . 32비트 int 를 사용시 플래그 범위는 0~31 (0 ~ 2147483647)이다 .
[Flags]
public enum MonsterType
{
    None = 0,
    Human = 1 << 0,
    Flyer = 1 << 1,
    Machine = 1 << 2,
    Fish = 1 << 3,
    All = int.MaxValue
};
 
 
MonsterType MyType = MonsterType.Human | MonsterType.Flyer ;
 
//값이 존재하는지 확인:
if((MyType & MonsterType.Human ) != 0) 

//값 특정 값이 있는지 확인 : .net 4.0 이상에 동작
typeAuth3.HasFlag(Auth3Type.Opt1);

//특정 값을 추가:
MyType |= MonsterType.Machine ;
 
//특정 값을 제거:
MyType &= ~MonsterType.Machine ;
 
//특정 값을 반전(있다면 빠지고 없다면 추가):
MyType ^= MonsterType.Contract;
 
//모든 값 삭제:
MyType = MonsterType.None;
 
//모든 값 설정:
MyType = MonsterType.All;
 
//특정 값을 제외하고 모두 설정:
MyType = MonsterType.All ^ MonsterType.Human ^ MonsterType.Machine ;

 

 

 

 

출처