Je suis en train de migrer un projet de Visual Basic vers C # et j'ai dû changer la façon dont une for
boucle utilisée est déclarée.
Dans VB.NET, la for
boucle est déclarée ci-dessous:
Dim stringValue As String = "42"
For i As Integer = 1 To 10 - stringValue.Length
stringValue = stringValue & " " & CStr(i)
Console.WriteLine(stringValue)
Next
Quelles sorties:
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 #, la for
boucle est déclarée ci-dessous:
string stringValue = "42";
for (int i = 1; i <= 10 - stringValue.Length; i ++)
{
stringValue = stringValue + " " + i.ToString();
Console.WriteLine(stringValue);
}
Et la sortie:
42 1
42 1 2
42 1 2 3
Ce n'est évidemment pas correct, j'ai donc dû modifier légèrement le code et j'ai inclus une variable entière qui contiendrait la longueur de la chaîne.
Veuillez consulter le code ci-dessous:
string stringValue = "42";
int stringValueLength = stringValue.Length;
for (int i = 1; i <= 10 - stringValueLength; i ++)
{
stringValue = stringValue + " " + i.ToString();
Console.WriteLine(stringValue);
}
Et la sortie:
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
Maintenant, ma question résout en quoi Visual Basic diffère de C # en termes de Visual Basic en utilisant la stringValue.Length
condition dans la for
boucle même si chaque fois que la boucle se produit, la longueur de la chaîne change. Alors que dans C # si j'utilise la stringValue.Length
dans la for
condition de la boucle , il modifie la valeur de chaîne initiale chaque fois que la boucle se produit. Pourquoi est-ce?
Réponses:
En C #, la condition aux limites de la boucle est évaluée à chaque itération. Dans VB.NET, il n'est évalué qu'à l'entrée dans la boucle.
Ainsi, dans la version C # de la question, comme la longueur de
stringValue
est modifiée dans la boucle, la valeur finale de la variable de boucle sera modifiée.Dans VB.NET, la condition finale est inclusive, vous utiliseriez donc à la
<=
place de<
C #.L'évaluation de la condition finale en C # a pour corollaire que même si elle ne varie pas mais qu'elle est coûteuse à calculer, elle doit être calculée une seule fois avant la boucle.
la source
<=
me permet d'itérer et d'avoir la même sortie que le code VB. Cependant, je suis plus intéressé de savoir pourquoi j'ai dû déclarer la variable entière etVB
je n'ai pas eu à le faire. Je vais mettre à jour ma question pour afficher la même sortie.stringValue
est modifiée dans la boucle, la valeur finale de la variable de boucle sera modifiée.Selon la documentation VB.NET :
Ainsi, la valeur de
To 10 - stringValue.Length
est évaluée une fois et réutilisée jusqu'à la sortie des boucles.Cependant, regardez l' instruction for c #
Ce qui signifie essentiellement que la condition
; i <= 10 - stringValueLength;
est à nouveau évaluée à chaque fois.Ainsi, comme vous l'avez vu, si vous souhaitez répliquer le code, vous devez déclarer le compteur final en c # avant de démarrer la boucle.
la source
Afin de rendre l'exemple plus compréhensible, je convertir à la fois pour les boucles en C # en boucles .
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 différence est alors:
la source
for loops
à mes débuts, je pense qu'ils sont beaucoup plus compréhensibles. C'est pourquoi j'ai «traduit» les exemples danswhile loops
, pour aider à comprendre.Parce que le
for
in VB est une sémantique différente dufor
in C # (ou de tout autre langage de type C)Dans VB, l'
for
instruction incrémente spécifiquement un compteur d'une valeur à une autre.En C, C ++, C #, etc., l'
for
instruction évalue simplement trois expressions:Dans VB, vous devez fournir une variable numérique qui peut être testée par rapport à une valeur terminale et incrémentée à chaque itération
En C, C ++, C #, etc., les trois expressions sont contraintes au minimum; l'expression conditionnelle doit être évaluée à un vrai / faux (ou un entier zéro / différent de zéro en C, C ++). Vous n'avez pas du tout besoin d'effectuer une initialisation, vous pouvez itérer n'importe quel type sur n'importe quelle plage de valeurs, itérer un pointeur ou une référence sur une structure complexe, ou ne rien itérer du tout.
Ainsi, en C #, etc., l'expression de condition doit être entièrement évaluée à chaque itération, mais en VB, la valeur terminale de l'itérateur doit être évaluée au début et n'a pas besoin d'être évaluée à nouveau.
la source