Maison >développement back-end >C++ >Opérations C# Bitwise Enum : une aide-mémoire concise ?

Opérations C# Bitwise Enum : une aide-mémoire concise ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-13 12:30:52481parcourir

C# Bitwise Enum Operations: A Concise Cheat Sheet?

Opérations sur les bits courantes dans les énumérations C#

Cet article vise à aider les développeurs à comprendre les opérations courantes sur les bits d'énumération en C#.

Question :

Lorsque vous effectuez des opérations au niveau des bits dans les énumérations, il est toujours difficile de savoir comment définir, effacer, basculer ou tester des bits individuels. Ces opérations ne sont pas couramment utilisées et sont donc faciles à oublier. Une « aide-mémoire sur les opérations sur bits » sera très utile.

Exemple :

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

ou

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

Pouvez-vous fournir des exemples pour toutes les autres opérations courantes ? Il est préférable d'utiliser la syntaxe C# et les énumérations [Flags].

Réponse :

Pour résoudre ce problème, certains développeurs ont créé des méthodes d'extension qui étendent System.Enum et ces méthodes sont plus pratiques à utiliser.

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

Ces méthodes peuvent être utilisées comme ceci :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn