在C#中等效的Visual Basic的And和Or?

时间:2010-10-14 04:15:42

标签: c# vb.net

我知道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吗?

6 个答案:

答案 0 :(得分:7)

And - > &

Or - > |

是的,Xor - > ^

答案 1 :(得分:7)

MSDN documentation for &&有一个示例,显示“常规AND”&和“短路AND”&&

请务必评论您对&的使用,因为大多数C#程序员都希望&&bool一起使用。


您还可以编写And扩展方法

static class BooleanExtensions
{
    public static bool And(this bool lhs, bool rhs)
    {
        return lhs & rhs;
    }
}

尽管你最好只坚持使用原生的&语法。请注意,AndAlso扩展方法没有用,因为rhs参数将作为方法调用的一部分进行评估。

答案 2 :(得分:1)

您只需&使用And|使用Or。当两个操作数都是布尔值时,^!=都等同于Xor(和彼此)。

答案 3 :(得分: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;
    }

答案 4 :(得分:0)

使用&|

答案 5 :(得分:0)

在这种情况下,您可以使用bitwise-and operator&):

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

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