问题描述
|
我是vb.net的新手,在将C#中的for循环转换为VB.net时遇到了此问题
我意识到增量运算符在vb.net中不可用(++和-)
而我能够做到类似
cnt +=1
我进行了一些研究,并在同一篇文章中看到了Eric的帖子,但实际上并不能完全理解。
他提到在VB中,声明不能只是表达。不知道这真的适合。
我希望这里的人能够解释为什么它不能像在C#中那样起作用。
(希望这也适用,因为我们在C#中有==
进行比较)
解决方法
我想说的是,语言设计师只是在设计
Visual BASIC
时认为BASIC
比C
更好的基线。您可以沿C
(earlier6 earlier)至C++
,Java
和C#
沿袭。
VB
血统来自达特茅斯(最初是ѭ12()的BASIC
,完全是另一种野兽。
换句话说,以古老的“ 2”开始:
LET I = I + 1
可能已经被黑客入侵并被摧毁了很多:-)
根据埃里克(Eric \)的帖子,ѭ15确实只是一个表达式,产生i
的副作用是事件发生后i
会增加(i++;
是一个表达式,就像非副作用表达式i;
一样)。
那是因为C
允许这些裸露的表情,甚至像ѭ21things这样的东西并没有真正作用,但完全有效。换句话说,以下是完整的“ 3”程序:
int main (void) { 1; 2; 3; 4; 5; 6; 7; 8; 9; return 0; }
所有这些表达式都是有效的,但没有用。
在BASIC
中,这并没有真正完成,因为BASIC
由语句(做某事的事物)组成。这就是为什么i += 1
(一个递增i
的语句)被认为是洁食,而i++
(一个不做任何事情而恰好具有递增i
的副作用的表达式)却没有的原因。您可能会争辩说这只是语义上的分裂,毫无疑问,十位设计师的确曾争辩。
但是赢得比赛的那一组是“我们不需要在心爱的语言中散发出无趣的三分”。
您应该感谢小怜悯,至少您不必与COBOL打交道:
ADD 1 TO DD_WS_I.
, 仅仅是因为设计师认为当您拥有26英镑时,不需要28英镑。
For
循环不需要任何一个,因此您不会丢失任何东西。
毕竟是Visual Basic ...为什么要使其复杂?
, 正如@paxdiablo所说,在VB中(或更确切地说,在其祖先BASIC中),所有内容以前都是语句。实际上,每个语句都是由关键字引入的。
所以要分配一个变量
LET x = x + 1
并调用一个方法,我们有
CALL SomeMethod
在VB中,ѭ38和ѭ39最终被删除(在一种特殊情况下除外),因为它们完全是多余的,并且没有增加清晰度。但是VB的基本词汇语法并没有太大改变:每个语句仍然必须是一个语句。 i++
在VB中不是语句,因为它既没有函数调用也没有赋值。
在VB.NET的第一个版本中有一个争论,是否像C#中那样引入前后增量运算符。由于一个非常简单的原因,决定不执行此操作:无论如何,建议不要在表达式中使用副作用。通常它会使清晰度受损。因此,即使在C#中,表达式中对i++
的合法使用也很少见,而对++i
的合法使用仍然很少见(尽管在某些情况下我不会否认它会增加清晰度)。
在大多数情况下,您可以很好地使用i += 1
,这很好地表达了意图。
请注意,在C ++中,情况根本不同,因为在这里(但在C#中不是),由于运算符重载,i++
实际上具有与i += 1
不同的语义(在C#中,我们也有运算符重载,但++
无法重载)。
,作为VB中表达式和语句之间差异的一个示例,
在VB中,以下代码会产生编译器错误,因为ѭ471,将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
(并且不要将赋值返回到return48 to)。
在这种情况下,不使用增量值(使用增量前的值)。如前所述,VB编译器要求您使用或分配操作值。
++count
说,首先增加increment48ѭ,然后将赋值返回return48ѭ。
在这种情况下,将为“ 48”分配+1的值作为表达式的值返回。如前所述,VB中的分配不会产生结果。
因此,在VB中实现这些运算符会有些痛苦。
, 以下扩展方法复制++x
x++
65ѭ66
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