문제

내 대상 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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top