여러 상태를 하나의 변수로 저장하는 방법은 무엇입니까?
-
13-09-2019 - |
문제
내 대상 Item
결합 할 수있는 여러 바이너리 상태가 있습니다
bool CanBeSold;
bool CanBeBought;
bool CanBeExchanged;
현재 값의 조합을 하나의 변수로 저장해야합니다. 그 이유는이 값을 DB에 저장해야하기 때문입니다. C ++에서는 한 상태가 약간 차지하는 비트 마스크를 만듭니다. .NET에서 모범 사례입니까?
해결책
당신은에 열거를 사용할 수 있습니다 Flags
기인하다:
[Flags]
enum MyStates {
CanBeSold = 1,
CanBeBought = 2,
CanBeExchanged = 4
}
열거는 아래의 필수 데이터 유형이므로 일반적인 방식으로 결합 할 수 있습니다.
state = MyStates.CanBeSold | MyStates.CanBeExchanged
이것은 열거 값이 2의 힘 일 때만 작동합니다 ( 더그 퍼거슨 주석으로 지적) 따라서 여러 가지를 설정할 때 쉽게 결합 할 수 있으며 겹치지 않습니다.
값을 여러 다른 값의 조합으로 정의 할 수도 있습니다.
CanBeSoldOrBought = CanBeSold | CanBeBought
또는
CanBeSoldOrBought = 3
그런 다음 예상대로 작동합니다. 예를 들어 readwrite가 일반적으로 읽기 및 쓰기 비트의 조합 인 파일 권한에 대해서는 볼 수 있습니다.
그리고 네, 그것은 상당히 일반적인 관행입니다. 프레임 워크 자체는 여러 곳에서도 사용합니다.
일반적인 방법 확인하다 그런 다음 특정 비트가 설정되는 경우입니다
if ((state & MyStates.CanBeSold) != 0) { ... }
다른 팁
값이 정수의 비트에 해당하는 열거를 만듭니다. 플래그 속성을 추가하면 열거 값에 대해 약간의 비트 작업을 수행 할 수있었습니다.
[Flags]
public enum CanBe {
Sold = 1,
Bought = 2,
Exchanged = 4
}
이제 값간에 OR 연산자 만 사용할 수 있습니다.
CanBe can = CabBe.Sold | CanBe.Exchanged.
| = 연산자로 상태를 추가 할 수 있습니다.
can |= CanBe.Sold;
또는 여러 주 :
can |= CanBe.Sold | CanBe.Bought;
& = 운영자로 상태를 유지할 수 있습니다.
can &= CanBe.Sold;
또는 여러 주 :
can &= CanBe.Sold | CanBe.Bought;
~ 연산자를 사용하여 상태를 제거하여 값을 보완 할 수 있습니다.
can &= ~CabBe.Bough;
또는 seveal 상태 :
can &= ~(CabBe.Bough | CanBe.Exchanged);
& 운영자를 사용하여 상태를 확인할 수 있습니다.
if ((can & CanBe.Sold) != 0) ...
또는 한 번에 여러 주 :
if ((can & (CanBe.Sold | CanBe.Bought)) != 0) ...
또는 여러 주가 모두 설정되어 있는지 확인하십시오.
if ((can & (CanBe.Sold | CanBe.Bought)) == (CanBe.Sold | CanBe.Bought)) ...
.NET의 비트 마스크로 도이 작업을 수행 할 수 있습니다.
열거 내에서 상태를 값으로 정의 할 수 있습니다.
public enum ItemState { CanBeSold = 1; CanBeBought = 2; CanBeExchanged = 4 }
그런 다음 객체 안에서 할 수 있습니다
if (item.State ^ ItemState.CanBeSold) ....
각 비트를 지정할 때마다 깃발 열거를 사용할 수 있습니다.
[Flags]
enum MyStates {
CanBeSold = 0x1,
CanBeBought = 0x2,
CanBeExchanged = 0x4,
}
MyStates m_Flags;
// to set a flag:
m_Flags |= MyStates.CanBeSold;
// to unset a flag:
m_Flags &= ~MyStates.CanBeSold;