VB.net中没有增量运算符
本文关键字:运算符 net VB | 更新日期: 2023-09-27 17:59:01
我是vb.net的新手,在将C#中的for循环转换为vb.net时遇到了这个问题我意识到增量运算符在vb.net中不可用(++和--)而我能够做一些类似cnt +=1
的事情
我研究了一下,发现了孙的帖子,但并没有完全理解。他提到在VB中,语句不能仅仅是一个表达式不确定这是怎么回事。
我希望这里有人能够解释为什么它不能像在C#中那样工作。(希望这也适用于为什么我们在C#中使用==
进行比较)
我想说,在设计VisualBASIC时,语言设计师只是认为BASIC是比C更好的基线。您可以遵循C
(以及更早的BCPL
)到C++
、Java
和C#
的沿袭。
VB
谱系来自达特茅斯的原始BASIC
(以及更早的Fortran
),是一种完全不同的野兽。
换句话说,始于古老的BASIC
:
LET I = I + 1
可能已经被黑客入侵并摧毁足够:-)
根据Eric的帖子,i++;
实际上只是一个表达式,它产生了i
,副作用是i
在事件发生后递增(类似于非副作用表达式i;
)。
这是因为C
允许这些赤裸裸的表达,即使是像42;
这样的东西,它并没有起到多大作用,但却是完全有效的。换句话说,以下是一个完整的C
程序:
int main (void) { 1; 2; 3; 4; 5; 6; 7; 8; 9; return 0; }
所有这些表达式都是有效的,但没有用(当然最后的0
除外)。
在BASIC
中,这并没有真正做到,因为BASIC
由语句(做某事的事情)组成。这就是为什么i += 1
(一个递增i
的语句)被认为是可以的,但i++
(一个什么都不做的表达式,恰好有副作用,使i
递增)则不然。你可能会说这只是语义上的头发分裂,但事实就是这样
你应该感谢小恩惠,至少你不必处理COBOL:
ADD 1 TO DD_WS_I.
这只是因为设计师认为当你有i += 1
时,i++
是不必要的。
For
循环不需要任何一个,因此不会丢失任何内容。
毕竟它是VisualBasic。。。为什么要让它变得复杂?
正如@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)
当然,这同样适用于在字符串上使用+=
运算符。
什么是";在VB中,一个语句不能仅仅是一个表达式";刻薄
- VB编译器要求在某些赋值或其他操作中使用结果
- 因此,VB中的赋值操作不会产生结果。如果它这样做了,VB编译器将不允许它作为一个语句单独存在(编译器要求消耗结果)
- 因此,VB中的赋值可以用作语句,但不能用作表达式。也就是说,不能将赋值语句用作方法的参数或中间结果
- 在C#中,赋值操作会生成一个值。因此,为了使赋值作为语句独立存在,编译器不需要消耗所有结果
- C#中的推论是,任何其他产生结果的操作都可以单独作为一个语句。例如,
2 + 2
生成结果4
,并且可以作为一个语句单独存在,而在VB中则不能
对";为什么VB中没有增量前和增量后运算符"
count++
表示,首先返回count
的值,然后递增count
(不要将赋值返回给count
)
在这种情况下,不使用递增的值(使用递增之前的值)。如前所述,VB编译器要求您使用或分配操作值。
++count
表示,首先递增count
,然后将赋值返回给count
在这种情况下,将+1赋值给count
的值作为表达式的值返回。如前所述,VB中的赋值不会产生结果
因此,在VB中实现这些运算符会有一些严重的困难。
以下扩展方法复制++x
x++
--x
x--
Public Module INC_DEC
<Runtime.CompilerServices.Extension>
Public Function PreINC(ByRef x As Integer) As Integer
Return Interlocked.Increment(x)
End Function
<Runtime.CompilerServices.Extension>
Public Function PostINC(ByRef x As Integer) As Integer
Dim tmp = x
Interlocked.Increment(x)
Return tmp
End Function
<Runtime.CompilerServices.Extension>
Public Function PreDEC(ByRef x As Integer) As Integer
Return Interlocked.Decrement(x)
End Function
<Runtime.CompilerServices.Extension>
Public Function PostDEC(ByRef x As Integer) As Integer
Dim tmp = x
Interlocked.Decrement(x)
Return tmp
End Function
End Module