Visual Basic之间的差异'不是a = b'并且' a<> B'

时间:2017-07-26 16:24:46

标签: vb.net optimization

标题真的说明了一切。在VB.NET中,检查值相等

时,这些语句之间存在差异
Dim notEqualsCompare as Boolean = Not a = b
Dim angleBracCompare as Boolean = a <> b

我通常使用&#39;不是a = b&#39;只是因为它读得更好。 我读了&#39;&lt;&gt;&#39;运算符&#39;小于或大于&#39;这对数值只有真正意义,但从我的简短测试来看,它们的行为相同。

是否有一种情况更可取?

2 个答案:

答案 0 :(得分:1)

在实践中,它们应始终在功能上相同。

正如其他一个答案中所提到的,Not a = b在逻辑上是两个独立的操作。您可能相信编译器会为您优化它,但是,无论如何,大多数程序员都同意,如果一种语言有一个运算符来执行您想要的操作,您通常应该使用该语言的该功能而不是使用多个操作来完成同样的结果。如果您不喜欢该语言,请选择其他语言。但是,如果您要使用VB,最好习惯它并利用它的语法。

从技术上讲,值得一提的是,它们并非必然相同。以下所有这三行在技术上可能会有不同的结果:

result = Not a = b
result = a <> b
result = Not a.Equals(b)

它们可能不同的原因是因为VB允许您覆盖=运算符(相等测试,而不是赋值),<>运算符,Not运算符和Equals方法。因此,即使覆盖这些东西并为每个东西提供不同的功能将是可怕的,但在技术上是可行的。出于显而易见的原因,"official" guidelines from Microsoft建议他们始终保持一致。

考虑:

Public Sub Main()
    Dim a As New Crazy()
    Dim b As New Crazy()
    Console.WriteLine(a = b)            ' False
    Console.WriteLine(a.Equals(b))      ' True
    Console.WriteLine(a <> b)           ' False
    Console.WriteLine(Not a)            ' "Opposite"
    Console.WriteLine(Not a = b)        ' True
    Console.WriteLine(Not a.Equals(b))  ' False
End Sub

Private Class Crazy
    Public Shared Operator <>(x As Crazy, y As Crazy) As Boolean
        Return False
    End Operator

    Public Shared Operator =(x As Crazy, y As Crazy) As Boolean
        Return False
    End Operator

    Public Overrides Function Equals(obj As Object) As Boolean
        Return True
    End Function

    Public Shared Operator Not(value As Crazy) As String
        Return "Opposite"
    End Operator
End Class

答案 1 :(得分:0)

他们都产生相同的答案,但是,a <> b可能会更有效率。原因是当编译器出现“Not a = b”时,编译器必须首先进行比较(a = b),然后必须使用时钟周期来翻转该登录(Not)。在执行a <> b时,编译器只需要进行比较然后就完成了。看看这张图表:

a <> b    ' One Operation
c = a = b      ' One Operation
Not c          ' Another Operation