在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。这种奇怪的=
行为会导致我应该注意的其他怪癖吗?
答案 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
仍然等于一个。
=
没有怪癖。它完全按照记录的方式工作,并且始终具有(包括其前身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)