在C#中,与Visual Basic的And和Or等效的运算符是什么?

7
我知道AndAlso相当于&&OrElse相当于||。但是,在C#中实现与Visual Basic的AndOr等效的最简洁方法是什么呢?
例如,考虑以下VB.NET代码。 ValidateForControl方法执行一些验证并返回指定控件状态是否有效。如果所有控件都有效,则整个输入表单有效。但是,即使一个控件无效,每个控件也必须单独进行验证(这需要运算符不短路)。对于这种情况,Visual Basic的And运算符非常完美,但是据我所知,在C#中没有等效的运算符(&&会短路)。
Return _
    Me.ValidateForControl(Me.firstNameTextBox) And
    Me.ValidateForControl(Me.middleNameTextBox) And
    Me.ValidateForControl(Me.lastNameTextBox) And
    Me.ValidateForControl(Me.streetAddressTextBox) And
    Me.ValidateForControl(Me.cityTextBox) And
    Me.ValidateForControl(Me.stateComboBox) And
    Me.ValidateForControl(Me.zipCodeMaskedTextBox) And
    Me.ValidateForControl(Me.phoneMaskedTextBox) And
    Me.ValidateForControl(Me.emailAddressTextBox) And
    Me.ValidateForControl(Me.checkInDateTimePicker) And
    Me.ValidateForControl(Me.checkOutDateTimePicker) And
    Me.ValidateForControl(Me.rentalUnitsGroupBox)

此外,对于布尔值,在C#中使用的符号“^”是否等同于Visual Basic中的“Xor”?

3
最终有一个好的用户案例证明了非短路运算符是必要的。 - Michael Buen
1
你写道:“即使一个控件是有效的,每个控件都必须进行验证。” 即使你使用短路运算符,这也是会发生的。AndAlso&&只有在操作数之一为False时才会短路。你的意思是“即使一个控件是无效的,每个控件都必须进行验证”吗? - MarkJ
6个回答

7
MSDN关于&&的文档提供了一个示例,展示了“常规AND”&和“短路AND”&&的区别。
当使用&时,请注释您的用法,因为大多数C#程序员会期待在bool中使用&&
您还可以编写一个And扩展方法。
static class BooleanExtensions
{
    public static bool And(this bool lhs, bool rhs)
    {
        return lhs & rhs;
    }
}

虽然你可能最好只使用本机的&语法。请注意,AndAlso扩展方法是无用的,因为rhs参数会作为方法调用的一部分被评估。

+1 鼓励“注释你的使用”... 嘿,也要给这句双关语点个赞吧?;) - Jake Petroules

7

And --> &

Or --> |

是的,Xor --> ^


1

在历史上(B语言,C语言的前身),位运算符(& |)被用作逻辑运算符,但由于它不执行短路操作,他们很快修正了语言,并引入了短路运算符(&& ||)

事实上,由于这个原因,位运算符的优先级仍然保持着相同的运算符结合性。直到现在,位运算符(就像它的逻辑运算符一样)绑定到比较而不是表达式。

例如,这个运算符结合性...

if (A + B == C)

...不应该跟着这个:

if (A & B == C)

在第二段代码中,A 被独立地计算,而 B == C 则一起被计算。这就是为什么我们需要为位运算符加括号,以实现与数学运算相同的运算符结合性。
if ( ( A & B ) == C )

受到影响的不仅是C语言,Java和C#的设计者可以打破传统,给位运算符赋予与算术运算符相同的运算符结合性。但他们没有这样做,所以现有的大型C代码库可以在这些语言上重复使用。

以前,我不能理解为什么 &| 的行为不像 + - / * 一样。

要回答您的问题,只需使用位运算符:

    protected void Page_Load(object sender, EventArgs e)
    {

        bool isValid = A() & B();

        Response.Output.Write("<br>Is Valid {0}", isValid);

    }

    bool A()
    {
        Response.Write("<br>TestA");
        return false;
    }

    bool B()
    {
        Response.Write("<br>TestB");
        return true;
    }

1
你只需要使用 & 表示 And,使用 | 表示 Or。当两个操作数都是布尔型时,^!= 都等同于 Xor(并且彼此等同)。

0
在这种情况下,您可以使用按位与运算符&):
return
    this.ValidateForControl(this.firstNameTextBox) &
    this.ValidateForControl(this.middleNameTextBox) &
    this.ValidateForControl(this.lastNameTextBox) &
    this.ValidateForControl(this.streetAddressTextBox) &
    this.ValidateForControl(this.cityTextBox) &
    this.ValidateForControl(this.stateComboBox) &
    this.ValidateForControl(this.zipCodeMaskedTextBox) &
    this.ValidateForControl(this.phoneMaskedTextBox) &
    this.ValidateForControl(this.emailAddressTextBox) &
    this.ValidateForControl(this.checkInDateTimePicker) &
    this.ValidateForControl(this.checkOutDateTimePicker) &
    this.ValidateForControl(this.rentalUnitsGroupBox);

是的,在C#中,xor的拼写为^(就像大多数类C语言一样)。


0

使用 &|


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接