2013-02-22 1 views
0

C#에서 enum을 연구하려고합니다. 내가 몇몇 문서를 읽으면서 나는 프로그램을 쓴다. 그러나 나는 이 프로그램이 어떻게 작동하는지 이해하지 못한다. 아무도 제발 그 일에 대해 제발 도와 줄 수 없어? 내가 아래에있는 내 코드를 게시하고Enums에 대한 FlagsAttribute

:

프로그램을 1 :

public partial class MainPage { 
    [Flags] 
    enum Days { 
     Monday, 
     Tuesday, 
     Wednesday, 
     Thursday, 
     Friday , 
     Saturday, 
     Sunday 
    }; 

    // Constructor 
    public MainPage() { 
     InitializeComponent(); 
     Days holidays = Days.Sunday | Days.Saturday; 
     if ((Days.Sunday | holidays) == Days.Sunday) // This returns true. Why ? 
      MessageBox.Show("True"); 
     else 
      MessageBox.Show("False"); 
    } 

프로그램 2 : 여기 열거

public partial class MainPage { 
    [Flags] 
    enum Days { 
     Monday = 1, 
     Tuesday = 2, 
     Wednesday = 5, 
     Thursday = 8, 
     Friday = 10, 
     Saturday = 3, 
     Sunday = 0 
    }; 

    // Constructor 
    public MainPage() { 
     InitializeComponent(); 
     Days holidays = Days.Sunday | Days.Saturday; 
     if ((Days.Sunday | holidays) == Days.Sunday) // Why this returns false ? 
      MessageBox.Show("True"); 
     else 
      MessageBox.Show("False"); 
    } 

에 정수 값을 할당

승 모자는 프로그램 2에서 정수 값을 할당 한 후 if 조건의 차이입니까? 0 기본 시작으로

+0

| 비트 OR을 수행합니다. – lahsrah

+0

왜 투표가 안되니?이 질문은 나쁜 것입니까? – Arun

+3

나는 그것이 나쁜 질문이라고 생각하지 않는다. 실제로 플래그 열거 형을 이해하는데 문제가있는 사람들을 시작했다. 아마도 더 나은 제목 설명이 더 적절할 것입니다. – TimothyP

답변

2

이진 표현은 일 중 두 번째 (정정) 정의를 고려, 제레미의 대답에 추가하려면 :

0000 0001 Monday 
0000 0010 Tuesday 
0000 0100 Wednesday 
0000 1000 Thursday 
0001 0000 Saturday 
0010 0000 Sunday 

다음은 다음

var holidays = Days.Sunday | Days.Saturday; 
을 수행

비트 단위로 또는 다음을 수행합니다.

 0001 0000 Saturday 
OR 0010 0000 Sunday 
     -------------------- 
     0011 0000 Saturday | Sunday 
,363,210

다음 사항을 점검 다음과 같은 의미

((Days.Sunday | holidays) == Days.Sunday) 

:

0010 0000 Sunday 
OR 0011 0000 holidays (= Saturday | Sunday) 
    --------- 
    0011 0000 This is still holidays and does not equal Sundays 

것은 당신이 '휴일'일요일 당신이 비트 AND

를 사용해야합니다 비트가 설정된 경우 (확인하려면 (Days.Sunday & 공휴일 == 일요일 일요일)

0010 0000 Sunday 
AND 0011 0000 holidays (= Saturday | Sunday) 
    --------- 
    0010 0000 Sunday 

또한 .NET Framework의 최신 버전을 가지고 있습니다 내장 지원 플래그 검사에 : [깃발], 당신을 적용하는 경우와 사용하지 않아야 데이즈 열거의

var holidays = Days.Sunday | Days.Saturday 
holidays.HasFlag(Days.Sunday) //Will return true 
holidays.HasFlag(Days.Monday) //Will return false 

귀하의 정의 이 게시물에서 귀하의 정의에있는 값과 동일한 논리를 사용하십시오. 매우 이상한 결과가 발생할 것입니다.

+0

티모시 감사합니다. 너는 그것을 잘 설명했다. 지금 나는 명확한 생각을 가지고있다. – Arun

+2

@TimothyP 당신은'Days.Monday = 0' 오류도 놓쳤습니다. 빠른, 업데이트 : P – Corey

+0

실제로 나는 미안했다. – TimothyP

3

열거, 예를 들면 :

[Flags] 
enum Days 
{ 
    Monday = 0, 
    Tuesday = 1, 
    Wednesday = 2, 
    Thursday = 3, 
    Friday = 4, 
    Saturday = 5, 
    Sunday = 6 
}; 

난 당신이 열거 형의 비트 연산자와 혼동지고 생각합니다. 일반적으로 열거 형이 비트 연산자와 함께 작동하도록하는 방법은 다음과 같이 선언 할 : 당신은 논리 연산자 ||와 비트 연산자 |을 혼동처럼

[Flags] 
enum Days 
{ 
    Monday = 0, 
    Tuesday = 1, 
    Wednesday = 2, 
    Thursday = 4, 
    Friday = 8, 
    Saturday = 16, 
    Sunday = 32 
}; 
+0

감사합니다. jeremy .. – Arun

2

보인다. 원래 프로그램에서

, 토요일은 5 할당과 일요일 6 할당

비트 단위 OR :

8 4 2 1 
0 1 0 1 = 5 Saturday 
0 1 1 0 = 6 Sunday 
----------- 
0 1 1 1 = 7 Result (Holiday). 

비트 단위 OR :

8 4 2 1 
0 1 1 1 = 7 Holidays 
0 1 1 0 = 6 Sunday 
----------- 
0 1 1 1 = 7 Result. 

그러나 나는 유사한 동일한 코드를 실행 :

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
    [Flags] 
    enum Days 
    { 
     Monday,  //Default 0 
     Tuesday, //Default 1 
     Wednesday, //Default 3 
     Thursday, //Default 4 
     Friday,  //Default 5 
     Saturday, //Default 6 
     Sunday  //Default 7 
    }; 

    static void Main(string[] args) 
    { 
     Days holidays = Days.Sunday | Days.Saturday; 
     if ((Days.Sunday | holidays) == Days.Sunday) // This returns true. Why ? 
      Console.WriteLine("True"); 
     else 
      Console.WriteLine("False"); 

     Console.ReadKey(); 
    } 
    } 
} 

결과 : False (귀하의 예와 같이 사실이 아닙니다).

예상대로 7이 6과 같지 않습니다. 내 생각에 사용자 코드에 누락 된 코드 또는 잘못된 입력 코드가 있습니다.

올바르게 사용하면 FlagsAttribute이 작동하는 방식을 읽는 것이 좋습니다. 비트 값 (1, 2, 4, 8, 16, 32)에서 열거 형을 만드는 것이 좋습니다.

코드가 수정 된 경우 이는 내가 찾고있는 것으로 더 많은 인라인이 될 것입니다.

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
    [Flags] 
    enum Days 
    { 
     Monday = 1, 
     Tuesday = 2, 
     Wednesday = 4, 
     Thursday = 8, 
     Friday = 16, 
     Saturday = 32, 
     Sunday = 64 
    }; 

    static void Main(string[] args) 
    { 
     Days holidays = Days.Sunday | Days.Saturday; 

     if ((Days.Sunday | holidays) == holidays) 
      Console.WriteLine("Sunday is a Holiday"); 
     else 
      Console.WriteLine("Sunday is a Holiday"); 

     if ((Days.Tuesday | holidays) == holidays) 
      Console.WriteLine("Tuesday is not a Holiday"); 
     else 
      Console.WriteLine("Tuesday is not a Holiday"); 

     Console.ReadKey(); 
    } 
    } 
} 

결과 : Sunday is a HolidayTuesday is not a Holiday

이 작동

비트 단위 때문에 OR :

64 32 16 8 4 2 1 
0 1 0 0 0 0 0 = 32 Saturday 
1 0 0 0 0 0 0 = 64 Sunday 
---------------------- 
1 1 0 0 0 0 0 = 96 Result (Holiday). 

비트 단위 OR :

64 32 16 8 4 2 1 
1 1 0 0 0 0 0 = 96 Holiday 
1 0 0 0 0 0 0 = 64 Sunday 
---------------------- 
1 1 0 0 0 0 0 = 96 Result (Holiday). 
,321 0 비트 단위 OR :

64 32 16 8 4 2 1 
1 1 0 0 0 0 0 = 96 Holiday 
0 0 0 0 0 1 0 = 32 Tuesday 
---------------------- 
1 1 0 0 0 1 0 = 97 Result (Not Holiday). 
+2

'Days.Monday'는 1로 정의해야합니다. 그렇지 않으면'(Days.Monday | holidays) == holidays'가 항상 true입니다. 또한, 더 나은 테스트는'(Days.Sunday & holidays) == Days.Sunday'입니다. 이것은 의도를보다 명확하게 나타내는 것입니다. – Corey

+0

감사합니다. –

관련 문제