【问题标题】:Equivalent of Visual Basic's And and Or in C#?等效于 C# 中的 Visual Basic 的 And 和 Or?
【发布时间】:2010-10-14 04:15:41
【问题描述】:

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

【问题讨论】:

  • +1 最后是一个很好的用户案例,其中保证了非短路操作符
  • 你写过“每个控件都必须经过验证,即使一个控件是 valid ”。即使您短路也会发生这种情况。 AndAlso , && 仅在操作数之一为 False 时短路。您的意思是“即使一个控件无效也必须验证每个控件”
  • @MarkJ 是的,你是对的,谢谢。 ;)

标签: c# vb.net


【解决方案1】:

And --> &

Or --> |

是的,Xor --> ^

【讨论】:

    【解决方案2】:

    MSDN documentation for && 有一个样本显示“常规与”& 和“短路与”&&

    请务必评论您对 & 的使用,因为大多数 C# 程序员会期望 &&bools。


    你也可以写一个And扩展方法

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

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

    【讨论】:

    • +1 表示“评论您的使用”...错误,评论。双关语+1? ;)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      在历史上(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;
          }
      

      【讨论】:

        【解决方案5】:

        使用&amp;|

        【讨论】:

          【解决方案6】:

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

          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 的语言一样)。

          【讨论】:

            猜你喜欢
            • 2015-03-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-20
            • 2019-07-01
            • 1970-01-01
            相关资源
            最近更新 更多