什么时候=执行比较而不是分配?

时间:2013-10-17 16:26:14

标签: vb.net

在VB.NET中,没有==运算符可供比较,因此=运算符可用于此目的以及赋值。我有一个函数,我希望它返回比较的布尔结果,而不将结果存储在变量中:

Private Function foo() As Boolean
    Dim bar As Integer = 1
    Return bar = 2
End Function

返回:False

好的,但bar的价值是什么?

Private Function foo() As KeyValuePair(Of Boolean, Integer)
    Dim bar As Integer = 1
    Return New KeyValuePair(Of Boolean, Integer)(bar = 2, bar)
End Function

返回:False, 1

看起来=会在语句上下文要求时执行比较,但是这有保证吗?也就是说,在这种情况下,我能确定bar永远不会被设置为2吗?

另外,我知道VB.NET不允许链接内联分配,may be for the best。这种奇怪的=行为会导致我应该注意的其他怪癖吗?

4 个答案:

答案 0 :(得分:3)

如果你开始用VB编写代码(来自像C#这样的语言),你应该开始习惯于特殊的VB做事方式;这是基于这个想法:尽可能简单直观的程序员。 “如果分配和比较总是发生在不同的上下文中,为什么不使用相同的运算符并让上下文定义它的确切含义?” - > VB-看东西的方式。 “不,不同的运营商必须考虑不同的现实。讨论结束” - > C#三通。 :)

这可靠吗?你能盲目地相信这些不总是清晰的程序员位吗?当然,VB.NET的特性是高度可靠和值得信赖的。您总是可以在某些上下文中使用=(或Is,但VS会告诉您)并完全确定代码将执行预期的操作。但问题是:你确定你写的是你想要的吗?

最后一个问题可能是对VB更具批评性,可能会给其他语言的程序员带来一些问题:灵活性越高,出错的可能性就越大;主要是如果你习惯了不同的格式。

关于链式内联赋值,老实说,我没有看到它的真实效用(并且从不在C#中使用它们)。关于C#的其他差异,有很多;在某些情况下,我认为C#方法更好;其他时候,VB.NET一个。关于代码的可读性/长度,我可以参考With Statement我总是发现某些有用的东西在C#中不存在。

答案 1 :(得分:3)

你不能在VB中进行内联作业,作业是一个明确的声明:

[Let] <<target-reference>> = <<value-expression>>

Let是可选且隐含的,几乎不再使用。可用于区分[Let]命令与等同性测试的一般规则是,对于Let,在语句中的目标引用之前不能有其他关键字。 AFAIK,在=作为等式测试的所有情况下,在语句中都有一个或多个其他关键字。

在第一个示例中,关键字Return位于=之前,因此它是一个相等测试,而不是一个赋值。

在您的第一个示例中,您可以执行以下任一操作:

Return 2

bar = 2
Return bar

至于你的问题“好,但是什么值吧?”,bar仍然等于一个。

VB中的

=没有怪癖。它完全按照记录的方式工作,并且始终具有(包括其前身BASIC,直到1968年)。

答案 2 :(得分:2)

100%确定表达式将被计算为布尔表达式的一种方法是使用()

e.g

Dim a = 2
Return (a = 1)

由于您无法使用括号将值设置为变量。

我想说的是:在一个返回的statament上,例如你不能为一个变量赋值,即使你使用

a = 1

编译器知道这个表达式只能是一个布尔表达式。

与if statament相同......

答案 3 :(得分:0)

回到QB45天,我们曾经利用“True”是数值-1的事实。所以你会看到像x = 1 - x * (x < 6)这样的代码(翻译:递增x,但是当它达到6时重置为1)