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