Подтвердить что ты не робот

Нет оператора инкремента в VB.net

Я новичок в vb.net и столкнулся с этой проблемой при преобразовании цикла for в С# на VB.net Я понял, что операторы инкремента недоступны в vb.net(++ и -) тогда как я смог сделать что-то вроде cnt +=1

Я немного изучил и наткнулся на

4b9b3361

Ответ 1

Я бы сказал, что разработчики языка просто подумали, что BASIC была лучшей базой, чем C при разработке Visual BASIC. Вы можете следовать линии C (и, ранее, BCPL) через C++, Java и C#.

Линия VB происходит от оригинального BASIC от Дартмута (и, ранее, Fortran) и совсем другого зверя.

Другими словами, то, что начиналось как почтенный BASIC:

LET I = I + 1

вероятно, был взломан и уничтожен достаточно: -)

Согласно сообщению Eric, i++; - это просто выражение, которое дает i с побочным эффектом, который i увеличивается после события (i++; является выражением, так же как и non-side -эффективное выражение i;).

Это потому, что C допускает эти голые выражения, даже такие вещи, как 42;, которые на самом деле мало что делают, но совершенно верны. Другими словами, следующая полная программа C:

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

Все эти выражения действительны, но бесполезны.

В BASIC это не было сделано, потому что BASIC состоял из утверждений (вещей, которые что-то делали). Поэтому i += 1 (выражение incrementing i) считается кошерным, но i++ (выражение, ничего не делающее, которое просто имеет побочный эффект, который увеличивает i), не является. Вы могли бы утверждать, что это просто семантическое расщепление волос, и, без сомнения, дизайнеры VB утверждали.

Но группа, которая выиграла этот день, была группой "мы не нуждаемся ни в каком stinkin" C в нашем любимом языке.

Вы должны быть благодарны за небольшие милости, по крайней мере, вам не нужно иметь дело с COBOL:

ADD 1 TO DD_WS_I.

Ответ 2

Просто потому, что дизайнеры думали, что i++ не нужно, если у вас есть i += 1.

Циклы

For не нуждаются ни в одном, поэтому вы ничего не теряете.

Это Visual Basic в конце концов... почему это осложняется?

Ответ 3

Как сказал @paxdiablo, в VB (или, вернее, у его предка BASIC) все было утверждением. И фактически каждое утверждение было введено по ключевому слову.

Итак, чтобы назначить переменную, мы имели

LET x = x + 1

и для вызова метода мы имели

CALL SomeMethod

В VB LET и CALL были окончательно сброшены (за исключением одного особого обстоятельства), потому что он полностью избыточен и не добавляет ясности. Но лежащая в основе лексическая грамматика VB не изменила все так много: каждый оператор все еще должен быть выражением. i++ не является оператором в VB, так как в нем отсутствует либо вызов функции, либо назначение.

В первой версии VB.NET был аргумент, следует ли вводить операторы pre и post-increment, как в С#. Было принято решение не делать этого по довольно простой причине: использование побочных эффектов в выражениях не рекомендуется в любом случае. Это, как правило, позволяет ясности страдать. Таким образом, даже в законных целях использования С# i++ в выражении очень редко, и законное использование ++i еще реже (хотя я не буду отрицать, что в некоторых случаях это добавляет ясности).

В большинстве случаев вы можете использовать i += 1 просто отлично, и это прекрасно отражает намерение.

Обратите внимание, что в С++ ситуация принципиально отличается, потому что здесь (но не в С#!) i++ на самом деле имеет другую семантику, чем i += 1 из-за перегрузки оператора (в С# мы также имеем перегрузку оператора, но ++ не может быть перегружен).

Ответ 4

В качестве примера разницы между выражением и выражением в 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 могут использоваться в качестве операторов, но не как выражения. То есть вы не можете использовать оператор присваивания как параметр для метода или как промежуточный результат.
  • В С# операция присваивания делает значение. Таким образом, для того, чтобы присваивания стояли в одиночестве в качестве операторов, компилятор делает не, чтобы все результаты были использованы.
  • Следствие в С# заключается в том, что любая другая операция, которая производит результат, может быть автономной как оператор. 2 + 2, например, производит результат 4 и может стоять в одиночестве как оператор, тогда как в VB он не может.

Упрощенный ответ на вопрос "Почему операторы pre и post increment не доступны в VB?"

count++ говорит, first возвращает значение count, , затем increment count (и не возвращает значение присваивания count).
В этом случае приращение не используется (используется значение до инкремента). Как упоминалось ранее, компилятор VB требует использования или назначения значений операций.

++count говорит, первый приращение count, , затем возвращает значение присваивания count.
В этом случае значение присваивания +1 для count возвращается как значение выражения. Как упоминалось ранее, задания в VB не приводят к результату.
Таким образом, возникнет серьезная боль, связанная с этими операторами в VB.

Ответ 5

Следующие методы расширения реплицируются ++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