Estoy en el proceso de migrar un proyecto de Visual Basic a C # y tuve que cambiar la forma en for
que se declara un bucle.
En VB.NET, el for
bucle se declara a continuación:
Dim stringValue As String = "42"
For i As Integer = 1 To 10 - stringValue.Length
stringValue = stringValue & " " & CStr(i)
Console.WriteLine(stringValue)
Next
Qué salidas:
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
En C #, el for
bucle se declara a continuación:
string stringValue = "42";
for (int i = 1; i <= 10 - stringValue.Length; i ++)
{
stringValue = stringValue + " " + i.ToString();
Console.WriteLine(stringValue);
}
Y la salida:
42 1
42 1 2
42 1 2 3
Obviamente, esto no es correcto, así que tuve que cambiar el código ligeramente e incluí una variable entera que mantendría la longitud de la cadena.
Consulte el código a continuación:
string stringValue = "42";
int stringValueLength = stringValue.Length;
for (int i = 1; i <= 10 - stringValueLength; i ++)
{
stringValue = stringValue + " " + i.ToString();
Console.WriteLine(stringValue);
}
Y la salida:
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
Ahora mi pregunta se resuelve en torno a cómo Visual Basic difiere de C # en términos de Visual Basic usando la stringValue.Length
condición en el for
bucle, aunque cada vez que ocurre el bucle cambia la longitud de la cadena. Mientras que en C # si uso la condición stringValue.Length
en el for
bucle, cambia el valor de la cadena inicial cada vez que ocurre el bucle. ¿Por qué es esto?
Respuestas:
En C #, la condición de límite de bucle se evalúa en cada iteración. En VB.NET, solo se evalúa al ingresar al ciclo.
Entonces, en la versión C # de la pregunta, debido a que la longitud de
stringValue
se está cambiando en el ciclo, se cambiará el valor de la variable del ciclo final.En VB.NET, la condición final es inclusiva, por lo que usaría en
<=
lugar de<
en C #.La evaluación de la condición final en C # tiene el corolario de que incluso si no varía pero es costoso de calcular, debe calcularse solo una vez antes del ciclo.
fuente
<=
me permite iterar y tener el mismo resultado que el código VB. Sin embargo, estoy más interesado en saber por qué tuve que declarar la variable entera yVB
no tuve que hacerlo. Actualizaré mi pregunta para mostrar el mismo resultado.stringValue
se está cambiando en el ciclo, se cambiará el valor final de la variable del ciclo.Según la documentación de VB.NET :
Por lo tanto, el valor de
To 10 - stringValue.Length
se evalúa una vez y se reutiliza hasta que salen los bucles.Sin embargo, mire c # para la declaración
Lo que básicamente significa que la condición
; i <= 10 - stringValueLength;
se evalúa nuevamente cada vez.Entonces, como vio, si desea replicar el código, debe declarar el contador final en c # antes de comenzar el ciclo.
fuente
Con el fin de hacer más comprensible el ejemplo, voy a convertir tanto para los bucles en C # , mientras que los bucles .
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++; }
La diferencia es entonces:
fuente
for loops
primeros, creo que son mucho más comprensibles. Es por eso que "traduje" los ejemploswhile loops
para ayudar a comprender.Porque
for
en VB es una semántica diferente afor
en C # (o cualquier otro lenguaje similar a C)En VB, la
for
declaración está incrementando específicamente un contador de un valor a otro.En C, C ++, C #, etc., la
for
declaración simplemente evalúa tres expresiones:En VB, debe proporcionar una variable numérica que pueda probarse con un valor terminal e incrementarse en cada iteración
En C, C ++, C #, etc., las tres expresiones están mínimamente restringidas; la expresión condicional debe evaluarse como verdadero / falso (o entero cero / distinto de cero en C, C ++). No necesita realizar una inicialización en absoluto, puede iterar cualquier tipo sobre cualquier rango de valores, iterar un puntero o referencia sobre una estructura compleja o no iterar nada en absoluto.
Entonces, en C #, etc., la expresión de la condición debe evaluarse completamente en cada iteración, pero en VB, el valor terminal del iterador debe evaluarse al principio y no es necesario evaluarlo nuevamente.
fuente