【问题标题】:No increment operator in VB.netVB.net 中没有增量运算符
【发布时间】:2011-09-14 10:19:22
【问题描述】:

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

我进行了一些研究并遇到了Eric's post,但并不能完全理解它。 他提到了在 VB 中,一个 STATEMENT 不能只是一个 EXPRESSION。 不确定它是如何真正适合的。

我希望这里有人能够解释为什么这与在 C# 中的工作方式不同。 (希望这也适用于我们在 C# 中使用 == 进行比较的原因)

【问题讨论】:

  • -1, 似乎又是一个 VB.NET 抨击会议?
  • @Gens 这不是 bash,我只是对为什么感兴趣
  • 您链接到的那篇文章中解释了原因。我不认为你会比这更接近它。
  • Python 也是如此。基本上,它允许更简单、更容易地解析代码,并有助于防止神秘的单行代码或意外行为。

标签: c# vb.net operators


【解决方案1】:

我想说,在设计 Visual BASIC。您可以通过C++JavaC# 跟踪C(以及更早的BCPL)的血统。

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.

【讨论】:

  • ok.. 您能否强调一下为什么它与语句与表达式有关(对不起,我对 VB 的了解非常少,如果我没有任何特别的 VB 背景知识,请提出建议)
  • 我不太确定我是如何偶然发现这个问题的,但答案很好。
  • 肯定将 LS-VAL-01 添加到 WS-VAL-DD 中,并提供 WS-VAL-DD-NEW。或者更好的是,计算...给予
  • 我正在处理 VB.NET 和 COBOL
【解决方案2】:

仅仅是因为设计者认为当你有i += 1时,i++是不必要的。

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

毕竟是视觉基本...为什么要复杂?

【讨论】:

  • 他们不认为在 C# 的情况下?
  • @V4Vendetta:不,因为它被设计成类似于 C/C++。
  • 我不同意 - 你也不能在任何表达式上下文中使用 i += 1,而在 C++ 中,++ii += 1 可以是更大表达式的一部分(例如 a[++i] = (b += 2);) .
【解决方案3】:

正如@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++ 实际上与i += 1 有一个不同的语义,因为运算符重载(在 C# 中我们也有运算符重载,但 ++ 不能重载)。

【讨论】:

    【解决方案4】:

    以VB中表达式和语句的区别为例, 在 VB 中,由于 count += 1count 加 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 中实现这些运算符会很痛苦。

    【讨论】:

      【解决方案5】:

      以下扩展方法复制++xx++--xx--

      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
      

      【讨论】:

      • VB.net 中的新宠。感谢@AdapSpeight 今天的笑声!
      猜你喜欢
      • 2011-04-12
      • 2016-07-21
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多