VB.net中没有增量运算符
我是vb.net的新手并且在将C#中的for循环转换为VB.net时遇到了这个问题我意识到增量运算符在vb.net(++和 – )中不可用,而我能够做到比如cnt +=1
我研究了一下,并发现了同样的埃里克的post ,但真的不能完全理解它。 他提到在VB中,STATEMENT不能仅仅是一种表达。 不确定这是如何真正适合的。
我希望这里的某个人能够解释为什么这不像C#中那样有效。 (希望这也是正确的,因为为什么我们在C#中有==
用于比较)
我会说语言设计者只是认为在设计Visual BASIC
时BASIC
是比C
更好的基线。 您可以通过C++
, Java
和C#
来遵循C
(以及之前的BCPL
)的沿袭。
VB
系列来自达特茅斯(以及之前的Fortran
)的原始BASIC
,并且完全是一个不同的野兽。
换句话说,最开始的是古老的BASIC
:
LET I = I + 1
可能已经遭到黑客攻击和摧毁:-)
根据Eric的post, i++;
确实只是一个表达式,产生i
的副作用是i
在事件之后递增( i++;
是一个表达式,就像非副作用表达式i;
)。
那是因为C
允许这些裸体表达,甚至像42;
这样的东西42;
这并没有真正做多少但完全有效。 换句话说,以下是一个完整的C
程序:
int main (void) { 1; 2; 3; 4; 5; 6; 7; 8; 9; return 0; }
所有这些表达都是有效但无用的。
在BASIC
,这并没有真正完成,因为BASIC
由语句 (做某事的事情)组成。 这就是为什么i += 1
(一个递增i
的语句)被认为是犹太教的但是i++
(一个表达什么都没有,恰好有副作用增加i
)不是。 你可以说它只是语义上的分裂,毫无疑问VB
设计师确实在争论。
但是赢得这一天的团体是“我们不需要在我们心爱的语言中使用stinkin” C
组。
你应该感谢小小的怜悯,至少你不必处理COBOL:
ADD 1 TO DD_WS_I.
仅仅因为当你有i += 1
时,设计师认为i++
是不必要的。
For
循环不需要任何一个,所以你不会丢失任何东西。
毕竟它是Visual Basic …为什么让它变得复杂?
正如@paxdiablo所说,在VB(或者更确切地说,在它的祖先BASIC中),一切都曾经是一个陈述 。 实际上,每个语句都是由关键字引入的。
所以要分配一个我们拥有的变量
LET x = x + 1
并且我们有一个方法
CALL SomeMethod
在VB中, LET
和CALL
最终被丢弃(除了在一个特殊情况下),因为它完全是冗余的并且不会增加清晰度。 但VB的潜在词汇语法并没有发生太大变化:每个陈述仍然必须是一个陈述 。 i++
不是VB中的语句,因为它缺少函数调用或赋值。
在VB.NET的第一个版本中有一个论点是否引入像C#中的前后增量运算符。 由于一个相当简单的原因决定不这样做:不建议在表达式中使用副作用。 它通常会让清晰度受损。 因此,即使在C#中, 在表达式中合法使用i++
也是非常罕见的,而且++i
合法用法仍然很少(尽管我不否认在某些情况下它会增加清晰度)。
在大多数情况下,您可以使用i += 1
,这很好地表达了意图。
请注意,在C ++中,情况根本不同,因为这里(但不是在C#中!)由于运算符重载, i++
实际上具有与i += 1
不同的语义 (在C#中我们也有运算符重载但++
不能重载)。
作为VB中表达式和语句之间差异的一个例子,在VB中,以下生成编译器错误,因为count += 1
递增count
为1,但整个表达式count += 1
不返回结果,因此它不能用作参数。
Dim count As Integer = 0 Console.WriteLine(count += 1) ' compiler error
你必须这样做
Dim count As Integer = 0 count += 1 Console.Writeline(count)
当然,同样适用于在String上使用+=
运算符。
什么“在VB中,一个声明不能只是一个表达”是什么意思?
- VB编译器要求在某些赋值或其他操作中使用结果。
- 因此,VB中的赋值操作不会产生结果。 如果确实如此,VB编译器将不允许它独立作为语句(编译器需要消耗结果)。
- 因此,VB中的赋值可以用作语句,但不能用作表达式。 也就是说,您不能将赋值语句用作方法的参数,也不能用作中间结果。
- 在C#中,赋值操作确实产生了一个值。 因此,为了使赋值独立于语句,编译器不需要消耗所有结果。
- C#的必然结果是产生结果的任何其他操作都可以单独作为语句。 例如
2 + 2
产生结果4
并且可以单独作为一个陈述,而在VB中它不能。
简化回答“为什么VB中没有前后增量运算符?”
count++
表示, 首先返回count
的值, 然后递增count
(并且不返回赋值的值)。
在这种情况下,不使用递增的值(使用递增前的值)。 如前所述,VB编译器要求您使用或分配操作值。
++count
表示, 首先递增count
, 然后返回赋值的值。
在这种情况下,将count
赋值+1的值作为表达式的值返回。 如前所述,VB中的赋值不会产生结果。
因此,在VB中实现这些运算符会有一些严重的痛苦。
以下扩展方法复制++x
x++
--x
x--
Public Module INC_DEC Public Function PreINC(ByRef x As Integer) As Integer Return Interlocked.Increment(x) End Function Public Function PostINC(ByRef x As Integer) As Integer Dim tmp = x Interlocked.Increment(x) Return tmp End Function Public Function PreDEC(ByRef x As Integer) As Integer Return Interlocked.Decrement(x) End Function Public Function PostDEC(ByRef x As Integer) As Integer Dim tmp = x Interlocked.Decrement(x) Return tmp End Function End Module