Я занимаюсь переносом проекта с Visual Basic на C #, и мне пришлось изменить способ объявления используемого for
цикла.
В VB.NET for
цикл объявлен ниже:
Dim stringValue As String = "42"
For i As Integer = 1 To 10 - stringValue.Length
stringValue = stringValue & " " & CStr(i)
Console.WriteLine(stringValue)
Next
Какие выходы:
42 1
42 1 2
42 1 2 3
42 1 2 3 4
42 1 2 3 4 5
42 1 2 3 4 5 6
42 1 2 3 4 5 6 7
42 1 2 3 4 5 6 7 8
В C # for
цикл объявлен ниже:
string stringValue = "42";
for (int i = 1; i <= 10 - stringValue.Length; i ++)
{
stringValue = stringValue + " " + i.ToString();
Console.WriteLine(stringValue);
}
И вывод:
42 1
42 1 2
42 1 2 3
Это, очевидно, неправильно, поэтому мне пришлось немного изменить код и включить целочисленную переменную, которая будет содержать длину строки.
Пожалуйста, посмотрите код ниже:
string stringValue = "42";
int stringValueLength = stringValue.Length;
for (int i = 1; i <= 10 - stringValueLength; i ++)
{
stringValue = stringValue + " " + i.ToString();
Console.WriteLine(stringValue);
}
И вывод:
42 1
42 1 2
42 1 2 3
42 1 2 3 4
42 1 2 3 4 5
42 1 2 3 4 5 6
42 1 2 3 4 5 6 7
42 1 2 3 4 5 6 7 8
Теперь мой вопрос решает вопрос о том, чем Visual Basic отличается от C # с точки зрения Visual Basic с использованием stringValue.Length
условия в for
цикле, хотя каждый раз, когда цикл возникает, длина строки изменяется. В то время как в C # , если я использую stringValue.Length
в for
условии цикла он меняет начальное значение каждый раз , когда строка , происходит цикл. Почему это?
Ответы:
В C # граничное условие цикла оценивается на каждой итерации. В VB.NET он оценивается только при входе в цикл.
Итак, в версии C # в вопросе, поскольку длина цикла
stringValue
изменяется в цикле, последнее значение переменной цикла будет изменено.В VB.NET последнее условие является включающим, поэтому вы должны использовать его
<=
вместо<
C #.Оценка конечного условия в C # приводит к тому, что даже если оно не меняется, но требует больших затрат на вычисление, его следует вычислять только один раз перед циклом.
источник
<=
позволяет мне выполнять итерацию и получать тот же результат, что и код VB. Однако мне больше интересно узнать, почему мне пришлось объявить целочисленную переменную, аVB
мне не пришлось. Я собираюсь обновить свой вопрос, чтобы показать тот же результат.stringValue
в цикле изменяется длина , последнее значение переменной цикла будет изменено.Согласно документации VB.NET :
Таким образом, значение
To 10 - stringValue.Length
оценивается один раз и повторно используется до выхода из цикла.Однако посмотрите на инструкцию С # for
Это в основном означает, что условие
; i <= 10 - stringValueLength;
каждый раз оценивается заново.Итак, как вы видели, если вы хотите реплицировать код, вам нужно объявить последний счетчик в C # перед запуском цикла.
источник
Чтобы сделать пример более понятным, я конвертирую оба цикла for в циклы while в C # .
VB.NET
string stringValue = "42"; int min = 1; int max = 10 - stringValue.Length; int i = min; while (i <= max) { stringValue = stringValue + " " + stringValue.Length.ToString(); Console.WriteLine(stringValue); i++; }
C #
string stringValue = "42"; int i = 1; while (i <= 10 - stringValue.Length) { stringValue = stringValue + " " + stringValue.Length.ToString(); Console.WriteLine(stringValue); i++; }
Тогда разница в следующем:
источник
for loops
самого начала, я думаю, что они намного понятнее. Вот почему я «перевел» примеры на языкwhile loops
, чтобы помочь понять.Поскольку
for
в VB семантика отличается отfor
в C # (или любом другом C-подобном языке)В VB
for
оператор специально увеличивает счетчик от одного значения до другого.В C, C ++, C # и т. Д.
for
Оператор просто вычисляет три выражения:В VB вы должны предоставить числовую переменную, которая может быть проверена на конечное значение и увеличиваться на каждой итерации.
В C, C ++, C # и т. Д. Эти три выражения минимально ограничены; условное выражение должно оцениваться как истина / ложь (или целое число ноль / ненулевое значение в C, C ++). Вам вообще не нужно выполнять инициализацию, вы можете выполнять итерацию любого типа в любом диапазоне значений, выполнять итерацию указателя или ссылки в сложной структуре или вообще ничего не повторять.
Таким образом, в C # и т. Д. Выражение условия должно полностью оцениваться на каждой итерации, но в VB конечное значение итератора должно оцениваться в начале и не должно оцениваться снова.
источник