> 백엔드 개발 > C++ > C# 비트별 열거형 연산: 간결한 치트 시트?

C# 비트별 열거형 연산: 간결한 치트 시트?

Patricia Arquette
풀어 주다: 2025-01-13 12:30:52
원래의
477명이 탐색했습니다.

C# Bitwise Enum Operations: A Concise Cheat Sheet?

C# 열거형의 일반적인 비트 연산

이 문서의 목적은 개발자가 C#의 일반적인 열거형 비트 작업을 이해하는 데 도움이 되는 것입니다.

질문:

열거형에서 비트 연산을 수행할 때 개별 비트를 설정, 지우기, 전환 또는 테스트하는 방법은 항상 혼란스럽습니다. 이러한 작업은 일반적으로 사용되지 않으므로 잊어버리기 쉽습니다. "비트 작업 치트 시트"가 매우 도움이 될 것입니다.

예:

<code class="language-csharp">flags = flags | FlagsEnum.Bit4;  // 设置第 4 位。</code>
로그인 후 복사

또는

<code class="language-csharp">if ((flags & FlagsEnum.Bit4) == FlagsEnum.Bit4) // 是否有更简洁的方法?</code>
로그인 후 복사

다른 모든 일반적인 작업에 대한 예를 제공할 수 있나요? C# 구문과 [Flags] 열거형을 사용하는 것이 더 좋습니다.

정답:

이 문제를 해결하기 위해 일부 개발자는 System.Enum을 확장하는 확장 메서드를 만들었고 이러한 메서드는 사용하기 더 편리합니다.

<code class="language-csharp">namespace Enum.Extensions
{
    public static class EnumerationExtensions
    {
        public static bool Has<T>(this System.Enum type, T value)
        {
            try
            {
                return (((int)(object)type & (int)(object)value) == (int)(object)value);
            }
            catch
            {
                return false;
            }
        }

        public static bool Is<T>(this System.Enum type, T value)
        {
            try
            {
                return (int)(object)type == (int)(object)value;
            }
            catch
            {
                return false;
            }
        }

        public static T Add<T>(this System.Enum type, T value)
        {
            try
            {
                return (T)(object)(((int)(object)type | (int)(object)value));
            }
            catch (Exception ex)
            {
                throw new ArgumentException(
                    string.Format(
                        "无法将值添加到枚举类型 '{0}'。",
                        typeof(T).Name
                        ), ex);
            }
        }

        public static T Remove<T>(this System.Enum type, T value)
        {
            try
            {
                return (T)(object)(((int)(object)type & ~(int)(object)value));
            }
            catch (Exception ex)
            {
                throw new ArgumentException(
                    string.Format(
                        "无法从枚举类型 '{0}' 中移除值。",
                        typeof(T).Name
                        ), ex);
            }
        }
    }
}</code>
로그인 후 복사

이러한 방법은 다음과 같이 사용할 수 있습니다.

<code class="language-csharp">SomeType value = SomeType.Grapes;
bool isGrapes = value.Is(SomeType.Grapes); // true
bool hasGrapes = value.Has(SomeType.Grapes); // true

value = value.Add(SomeType.Oranges);
value = value.Add(SomeType.Apples);
value = value.Remove(SomeType.Grapes);

bool hasOranges = value.Has(SomeType.Oranges); // true
bool isApples = value.Is(SomeType.Apples); // false
bool hasGrapes = value.Has(SomeType.Grapes); // false</code>
로그인 후 복사

위 내용은 C# 비트별 열거형 연산: 간결한 치트 시트?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿