2012-11-06 2 views
2

나는 명시 적으로 나열하지 않고 모든 옵션을 정의하는 쉬운 방법을 원했기 때문에 다음과 같은 방식으로 선언 된 enum을 가지고 있습니다 (그러나 더 많은 옵션 - 약 15 정도). 플래그 유형 열거 형에 "catchall"을 정의하는 것이 현명한 방법입니까?

[Flags] 
enum Options 
{ 
    Option1 = 1, 
    Option2 = 2, 
    Option3 = 4, 
    Option4 = 8, 
    AllOptions = 15 
} 

그래서 대신

Options foo = Options.Option1 | Options.Option2 | Options.Option3 |... ad nauseum 

난 그냥

Options foo = Options.AllOptions; 

이 현명하다 말할 수 없다는

? 아니면 명시 적으로 나열하지 않고도 사용 가능한 모든 옵션을 변수에 제공하는 더 좋은 방법이 있습니까?

답변

6

변수를 명시 적으로 나열하지 않고도 사용 가능한 모든 옵션을 제공하는 더 좋은 방법이 있습니까?

Options allOptions = Flags.GetUsedBits<Options>(); 

(. 다음 제한없는 멜로디를 사용 할 수있는 다른 작업의 모든 종류가 있습니다)

는 개인적으로 내가 피하려고 것 :

글쎄, 당신은 내 Unconstrained Melody 프로젝트를 사용할 수 있습니다 "모든"값을 하드 코딩해야합니다. 새 값을 추가하고 "모든"값을 업데이트하는 것을 잊어 버리는 것은 너무 쉽습니다.

(나는 또한이 경우에는 AllOptions 명명 피할 것 - 그것은 단지, All을해야 Options.AllOptions의 중복을 피하기 위해.)

을 당신이 있는지 확인하기 위해 단위 테스트를 추가 할을 경우 당신은 그것을 올바르게했다 :)

+0

나는 제약이없는 멜로디 아이디어, 특히 목록에 더 많은 옵션을 추가하는 것이 자동으로 'allOptions' 변수에 포함된다는 사실을 좋아한다. 감사! –

4

이 작업을 수행 할 수 있습니다

[Flags] 
enum Options 
{ 
    Option1 = 1, 
    Option2 = 2, 
    Option3 = 4, 
    Option4 = 8, 
    AllOptions = Option1 | Option2 | Option3 | Option4 
} 

이 방식은 말 그대로 옵션 1과 옵션 2와 옵션 3과 | 옵를 의미한다. 의

Options.AllOptions; 

또는

Options.Option1 | Options.Option2 | Options.Option3 | Option.Option4 

모두 위와 같은 결과로 종료됩니다 : 당신은이를 사용할 수 있습니다.

관련 문제