VB.net中没有增量运算符

问题描述

| 我是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