"If"语句不返回其含义



我只是瞎了眼,还是这个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,它将"Not"等于其中任何一个,因此将显示消息框。

为什么它会进入if语句?

cond1 Or cond2 Or ... Or condn为真当且仅当至少一个给定条件为真。在你的情况下,总是至少有一个条件是真的(事实上,在每种情况下,至少有两个条件是真实的)。例如,如果textSample"D",则条件Not textSample = "E"和条件Not textSample = "F"将为真。因此,整个条件将成立。

长话短说:用And代替Or。

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

我相信你想要的是

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

这是因为使用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

这应该行得通。

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

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

如果您看不到差异,请检查两个版本的真值表。

我个人会这样写:

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

消息将始终显示。原因如下。在您的示例中,让我们说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)

如果(真)或(真)或者(假)

因此,无论textSample是什么,你的条件都是真的…(除非你的textSample可以同时等于"D"、等于"E"和等于"F")。

我想你想把"or"改成"and"。

最新更新