按位或组合

时间:2009-01-30 14:54:29

标签: c# .net bit-manipulation

这是最常用的Regex函数之一

Regex.IsMatch("Test text for regex test.", "(test)",
RegexOptions.IgnoreCase | RegexOptions.Multiline);

你能解释一下Regex.IsMatch方法是如何工作的吗? 我的意思是它如何处理按位OR RegexOptions参数? 它如何定义方法参数?

感谢您的回复!

2 个答案:

答案 0 :(得分:7)

RegexOptions是一个应用了[Flags]属性的枚举。这允许按位运算应用于各种值。

你也可以做类似的事情:

[Flags]
enum MyOptions {
   UpperCase = 1,
   Reverse   = 2,
   Trim      = 4
}

public static void DoTransform(MyOptions options) {
    if ((options & MyOptions.UpperCase) == MyOptions.UpperCase) {
        /* Do Upper case transform */
    }
    if ((options & MyOptions.Reverse) == MyOptions.Reverse) {
        /* Do Reverse transform */
    }
    /* etc, ... */
}

DoTransform(MyOptions.UpperCase | MyOptions.Reverse);

我刚刚根据Frank的评论进行了更多的挖掘,他是正确的,无论有没有[Flags]属性,上面的代码都会编译并运行。

关于[Flags]属性所做的事情还有其他评论,但除了“它影响ToString()结果”之外没有人似乎知道或想要解释做什么做什么。在我编写的代码中,我装饰了我打算用作具有[Flags]属性的位域的枚举,因此在这种情况下它至少在某种程度上是自我记录的。否则,我不知所措。

答案 1 :(得分:0)

RegexOptions是一个枚举,意思是在内部,它表示为整数。它的值看起来像这样:

// note the powers of 2
enum RegexOptions {
    IgnoreCase = 1,      MultiLine = 2,
    SomeOtherOption = 4, YetAnotherThing = 8 }

这些值的设计使得如果用二进制表示它们,每个值都有一个位。

因此,如果你采用两个值的按位OR并以结果结束,你可以通过评估(结果AND IgnoreCase)来确定是否设置了其中一个值(例如IgnoreCase)。