【问题标题】:'If' statement doesn't return what it's meant to“如果”语句不返回它的意思
【发布时间】:2012-04-07 10:39:09
【问题描述】:

我只是瞎了眼还是if 声明真的没有达到它的目的?

Dim textSample as String = "F"
If Not textSample = "D" Or Not textSample = "E" Or Not textSample = "F" Then
    MessageBox.Show("False")
End If

即使 textSample 是其中一个字母,它也会显示消息框。在我看来,if 语句应该看到 textSample 是其中一个字母并跳过它,而如果它是 Z,它将“不”等于其中任何一个,因此会显示消息框。

为什么会进入if语句?

【问题讨论】:

标签: vb.net if-statement not-operator


【解决方案1】:

cond1 Or cond2 Or ... Or condn 为真当且仅当至少一个给定条件为真。在您的情况下,总是至少有一个条件为真(实际上在每种情况下至少有两个条件为真)。例如,如果textSample"D",那么条件Not textSample = "E" 和条件Not textSample = "F" 将为真。所以整个条件都是真的。

长话短说:使用 And 而不是 Or。

【讨论】:

    【解决方案2】:

    它运行正常。 True Or True Or False = True

    我相信你想要的是

    Dim tBadLetters() As String = {"D", "E", "F"}
    
    If Not tBadLetters.COntains(txtSample)
      MsgBox("blah")
    End If
    

    【讨论】:

      【解决方案3】:

      这是因为您使用 OR 子句,您需要使用 AND。基本上你说如果 textSample 不是 D 然后显示你的消息框。

      改成:

      Dim textSample as String = "F"
      If Not textSample = "D" AND Not textSample = "E" AND Not textSample = "F" Then
         MessageBox.Show("False")
      End If
      

      应该可以的。

      【讨论】:

        【解决方案4】:

        您的 if 条件可能为 false 的 textSample 没有任何值。我想你想要这个:

        If Not (textSample = "D" Or textSample = "E" Or textSample = "F") Then 
           MessageBox.Show("False")
        

        如果您没有发现差异,请检查 the truth tables for both versions

        【讨论】:

          【解决方案5】:

          我个人会这样写:

          Dim textSample As String = "F"
          
          If textSample <> "D" AndAlso textSample <> "E" AndAlso textSample <> "F" Then
             MessageBox.Show("False")
          End If
          

          如果你和我一样喜欢使用 .NET 的可链接性,我还为自己编写了几个字符串扩展,用于此类情况:

          Public Module StringExtensions
          
              <Extension()> _
              Public Function IsNullOrBlank(ByVal s As String) As Boolean
                  Return s Is Nothing OrElse s.Trim.Length.Equals(0)
              End Function
          
              <Extension()> _
              Public Function IsNotNullOrBlank(ByVal s As String) As Boolean
                  Return s IsNot Nothing AndAlso s.Trim.Length > 0
              End Function
          
              <Extension()> _
              Public Function IsEqualToAny(ByVal s As String, ByVal ParamArray values As String()) As Boolean
                  If s.IsNotNullOrBlank AndAlso values.Length > 0 Then
                      For Each value As String In values
                          If s = value Then Return True
                      Next
                  End If
          
                  Return False
              End Function
          
              <Extension()> _
              Public Function IsNotEqualToAny(ByVal s As String, ByVal ParamArray values As String()) As Boolean
                  If s.IsNotNullOrBlank AndAlso values.Length > 0 Then
                      For Each value As String In values
                          If s = value Then Return False
                      Next
                  End If
          
                  Return True
              End Function
          
          End Module
          

          然后我可以像这样写你的 If 语句:

          Dim textSample As String = "F"
          
          If textSample.IsNotEqualToAny("D", "E", "F") Then
             MessageBox.Show("False")
          End If
          

          【讨论】:

            【解决方案6】:

            消息将始终显示。这就是为什么。在您的示例中,让我们说 textSample = "F"。那么

            if Not F equals D  Or  Not F equals E  or Not F equals F
            

            所以让我们总结一下:

            if (F not equals D ) or ( F not equals E ) or ( F not equals F)
            

            ... if (true) or (true) or (false)

            因此,无论 textSample 是什么,您的条件都是正确的......(除非您的 textSample 可能同时等于“D”并且等于“E”并且等于“F”)。

            我想你想把“或”改成“和”。

            【讨论】:

              猜你喜欢
              • 2014-10-31
              • 2018-01-31
              • 2014-01-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-12-03
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多