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中文網其他相關文章!