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 サイトの他の関連記事を参照してください。