对枚举最常见的C#按位操作

在我的生活中,我不记得如何设置,删除,切换或测试位域中的某个位。 要么我不确定,要么我混淆起来,因为我很少需要这些。 所以一个“一点点作弊表”将是很好的。

例如:

flags = flags | FlagsEnum.Bit4;  // Set bit 4.

要么

if ((flags & FlagsEnum.Bit4)) == FlagsEnum.Bit4) // Is there a less verbose way?

你能给出所有其他常用操作的例子,最好是使用[Flags]枚举的C#语法吗?


我对这些扩展做了更多的工作 - 您可以在这里找到代码

我写了一些扩展方法来扩展我经常使用的System.Enum ...我并不是声称它们是防弹的,但它们帮助了...评论删除了...

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(
                        "Could not append value from enumerated type '{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(
                        "Could not remove value from enumerated type '{0}'.",
                        typeof(T).Name
                        ), ex);
            }  
        }

    }
}

然后他们像下面一样使用

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

在.NET 4中,您现在可以编写:

flags.HasFlag(FlagsEnum.Bit4)

该习语是使用按位或相等运算符来设置位:

flags |= 0x04;

要清楚一点,这个习语是使用按位和否定:

flags &= ~0x04;

有时你有一个偏移量来识别你的位,然后这个习惯用法就是将这些与左移相结合:

flags |= 1 << offset;
flags &= ~(1 << offset);
链接地址: http://www.djcxy.com/p/36385.html

上一篇: Most common C# bitwise operations on enums

下一篇: Why does AngularJS include an empty option in select?