ホームページ > バックエンド開発 > 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート