4

In VB.NET, there's no == operator for comparison, so the = operator serves that purpose as well as assignment. I have a function, and I want it to return the boolean result of a comparison, without storing that result in a variable:

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

Returns: False

OK, but what's the value of 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

Returns: False, 1

It looks like = will perform a comparison when the statement context demands it, but is this guaranteed? That is, can I be sure that bar will never be set to 2 in this situation?

Also, I know that VB.NET doesn't allow chained inline assignments, which may be for the best. Does this odd = behavior cause any other quirks I should be aware of?

4

4 回答 4

3

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

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

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

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

于 2013-10-17T16:41:10.443 回答
3

您不能在 VB 中进行内联赋值,Assignment 是一个显式语句:

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

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

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

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

Return 2

或者

bar = 2
Return bar

至于你的问题“好的,但是 bar 的值是多少? ”,bar仍然等于 1。

=在 VB 中没有怪癖。它的工作方式与文档完全一致,并且一直如此(包括其前身 BASIC,可追溯到 1968 年)。

于 2013-10-17T16:43:48.423 回答
2

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

例如

Dim a = 2
Return (a = 1)

由于您不能在括号内为变量设置值。

我想说的是:例如,在返回状态中,即使您使用,您也无法将值分配给变量

a = 1

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

与 if statament 相同,依此类推。

于 2013-10-17T16:44:47.200 回答
0

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

于 2013-10-18T00:40:38.200 回答