Heim >Backend-Entwicklung >C++ >C# Bitwise Enum-Operationen: Ein prägnanter Spickzettel?

C# Bitwise Enum-Operationen: Ein prägnanter Spickzettel?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-13 12:30:52481Durchsuche

C# Bitwise Enum Operations: A Concise Cheat Sheet?

Gemeinsame Bitoperationen in C#-Aufzählungen

Dieser Artikel soll Entwicklern helfen, gängige Aufzählungsbitoperationen in C# zu verstehen.

Frage:

Bei bitweisen Operationen in Aufzählungen ist es immer verwirrend, wie man einzelne Bits setzt, löscht, umschaltet oder testet. Diese Vorgänge werden nicht häufig verwendet und können daher leicht vergessen werden. Ein „Bit-Operations-Spickzettel“ wird sehr hilfreich sein.

Beispiel:

<code class="language-csharp">flags = flags | FlagsEnum.Bit4;  // 设置第 4 位。</code>

oder

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

Können Sie Beispiele für alle anderen gängigen Vorgänge nennen? Es ist besser, C#-Syntax und [Flags]-Enumerationen zu verwenden.

Antwort:

Um dieses Problem zu lösen, haben einige Entwickler Erweiterungsmethoden erstellt, die System.Enum erweitern und diese Methoden bequemer zu verwenden sind.

<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>

Diese Methoden können wie folgt verwendet werden:

<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>

Das obige ist der detaillierte Inhalt vonC# Bitwise Enum-Operationen: Ein prägnanter Spickzettel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn