.NET의 내장 플래그 열거 연산은 불행히도 상당히 제한적입니다. 대부분의 경우 사용자는 비트 연산 논리를 알아 내야합니다.
.NET 4에는 사용자의 코드를 단순화하는 데 도움 HasFlag
이 Enum
되는 방법 이 추가 되었지만 불행히도 많은 문제가 있습니다.
HasFlag
주어진 열거 형뿐만 아니라 모든 유형의 열거 형 값 인수를 허용하므로 형식이 안전하지 않습니다.
HasFlag
값에 열거 형 값 인수가 제공하는 플래그가 모두 있는지 또는 없는지 여부를 확인하는 것이 모호합니다. 그건 그렇고
HasFlag
복싱이 필요하기 때문에 할당이 느려져 가비지 수집이 증가합니다.
플래그 열거 형에 대한 .NET의 제한된 지원으로 인해 이러한 각 문제를 해결하고 플래그 열거 형을 훨씬 쉽게 처리 할 수 있는 OSS 라이브러리 Enums.NET 을 작성했습니다 .
다음은 .NET 프레임 워크를 사용하는 동등한 구현과 함께 제공되는 일부 조작입니다.
플래그 결합
.그물 flags | otherFlags
Enums.NET flags.CombineFlags(otherFlags)
깃발 제거
.그물 flags & ~otherFlags
Enums.NET flags.RemoveFlags(otherFlags)
공통 깃발
.그물 flags & otherFlags
Enums.NET flags.CommonFlags(otherFlags)
토글 플래그
.그물 flags ^ otherFlags
Enums.NET flags.ToggleFlags(otherFlags)
모든 플래그가 있음
.NET (flags & otherFlags) == otherFlags
또는flags.HasFlag(otherFlags)
Enums.NET flags.HasAllFlags(otherFlags)
플래그가 있습니다
.그물 (flags & otherFlags) != 0
Enums.NET flags.HasAnyFlags(otherFlags)
깃발 얻기
.그물
Enumerable.Range(0, 64)
.Where(bit => ((flags.GetTypeCode() == TypeCode.UInt64 ? (long)(ulong)flags : Convert.ToInt64(flags)) & (1L << bit)) != 0)
.Select(bit => Enum.ToObject(flags.GetType(), 1L << bit))`
Enums.NET flags.GetFlags()
이러한 개선 사항을 .NET Core에 통합하고 궁극적으로 전체 .NET Framework를 얻으려고합니다. 내 제안을 여기서 확인할 수 있습니다 .