VB.net中没有增量运算符

时间:2011-06-14 05:24:48

标签: c# vb.net operators

我是vb.net的新手,在将C#中的for循环转换为VB.net时遇到了这个问题 我意识到增量运算符在vb.net中不可用(++和 - ) 而我能够做类似cnt +=1

的事情

我研究了一下并且遇到Eric's post同样的事情,但实际上并没有完全理解它。 他提到在VB中,STATEMENT不能仅仅是一种表达。不确定它是如何真正适合的。

我希望这里的某个人能够解释为什么它不像C#中那样有效。 (希望这也适用于为什么我们在C#中==进行比较)

5 个答案:

答案 0 :(得分:33)

我想说语言设计者只是认为BASIC在设计C时比Visual BASIC更好。您可以关注C(以及之前的BCPL)到C++JavaC#的血统。

VB血统来自达特茅斯的原始BASIC(以及之前的Fortran),并且是完全不同的野兽。

换句话说,最开始的是古老的BASIC

LET I = I + 1

可能已经被黑客攻击并且足够: - )

根据Eric的帖子,i++;确实只是一个表达式,一个产生i的表达式,副作用是i在事件发生后递增(i++;是表达式,就像非副作用表达式i;)。

那是因为C允许这些裸体表达,甚至像42;这样的东西,它们并没有真正做很多但完全有效。换句话说,以下是完整的C计划:

int main (void) { 1; 2; 3; 4; 5; 6; 7; 8; 9; return 0; }

所有这些表达都是有效但无用的。

BASIC中,这并没有真正完成,因为BASIC语句(做某事的事情)组成。这就是为什么i += 1(一个递增i的语句)被认为是犹太教的原因,i++(一个表达什么都没有,恰好有副作用,增加i)不是。你可以说这只是语义上的分裂,毫无疑问VB设计师确实在争论。

但赢得这一天的团体是“我们心爱的语言”小组中的“我们不需要'C

你应该感谢小小的怜悯,至少你不必处理COBOL:

ADD 1 TO DD_WS_I.

答案 1 :(得分:7)

只是因为设计师认为i++时不需要i += 1

For循环不需要任何一个,所以你不会丢失任何东西。

毕竟是视觉基本 ...为什么会让它变得复杂?

答案 2 :(得分:6)

正如@paxdiablo所说,在VB中(或者更确切地说,在它的祖先BASIC中),一切都是语句。实际上,每个语句都是由关键字引入的。

所以要分配一个我们有的变量

LET x = x + 1

并且要调用方法,我们有

CALL SomeMethod

在VB中,LETCALL最终被删除(除了在一个特殊情况下),因为它完全是冗余的,并没有增加清晰度。但VB的基础词汇语法并没有发生太大变化:每个语句仍然必须是语句i++不是VB中的语句,因为它缺少函数调用或赋值。

在VB.NET的第一个版本中有一个论点是否要引入像C#中那样的前后增量运算符。由于一个相当简单的原因决定不这样做:不建议在表达式中使用副作用。它通常会让清晰度受损。因此,即使在C#中,i++ 在表达式中的合法使用也是非常罕见的,++i的合法用法仍然很少(尽管我不会否认在某些情况下它添加清晰度。)

在大多数情况下,您可以使用i += 1就好了,这非常好地表达了意图。

请注意,在C ++中,情况根本不同,因为这里(但不是在C#中!)i++实际上有一个不同的语义而不是{{1由于运算符重载(在C#中我们也有运算符重载但i += 1不能重载)。

答案 3 :(得分:4)

作为VB中表达式和语句之间差异的一个例子, 在VB中,以下生成编译器错误,因为count += 1count递增1,但整个表达式count += 1不返回结果,因此不能将其用作参数。< / p>

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(并且不返回值{转让给count) 在这种情况下,不使用递增的值(使用递增前的值)。如前所述,VB编译器要求您使用或分配操作值。

++count说,第一次增量count然后将作业的值返回count
在这种情况下,将指定+1到count的值作为表达式的值返回。如前所述,VB中的赋值不会产生结果 因此,在VB中实现这些运算符会有一些严重的痛苦。

答案 4 :(得分:3)

以下扩展方法会复制++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