Ich bin gerade dabei, ein Projekt von Visual Basic nach C # zu migrieren, und ich musste ändern, wie eine verwendete for
Schleife deklariert wird.
In VB.NET wird die for
Schleife unten deklariert:
Dim stringValue As String = "42"
For i As Integer = 1 To 10 - stringValue.Length
stringValue = stringValue & " " & CStr(i)
Console.WriteLine(stringValue)
Next
Welche Ausgänge:
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
In C # wird die for
Schleife unten deklariert:
string stringValue = "42";
for (int i = 1; i <= 10 - stringValue.Length; i ++)
{
stringValue = stringValue + " " + i.ToString();
Console.WriteLine(stringValue);
}
Und die Ausgabe:
42 1
42 1 2
42 1 2 3
Dies ist offensichtlich nicht korrekt, daher musste ich den Code geringfügig ändern und eine Ganzzahlvariable einfügen, die die Länge der Zeichenfolge enthält.
Bitte beachten Sie den Code unten:
string stringValue = "42";
int stringValueLength = stringValue.Length;
for (int i = 1; i <= 10 - stringValueLength; i ++)
{
stringValue = stringValue + " " + i.ToString();
Console.WriteLine(stringValue);
}
Und die Ausgabe:
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
Jetzt geht es um die Frage, wie sich Visual Basic in Bezug auf Visual Basic unter Verwendung der stringValue.Length
Bedingung in der for
Schleife von C # unterscheidet, obwohl sich die Länge der Zeichenfolge bei jedem Auftreten der Schleife ändert. Wenn ich in C # stringValue.Length
die for
Bedingung in der Schleife verwende, ändert sich der anfängliche Zeichenfolgenwert jedes Mal, wenn die Schleife auftritt. Warum ist das?
Antworten:
In C # wird die Schleifenrandbedingung bei jeder Iteration ausgewertet. In VB.NET wird es nur beim Eintritt in die Schleife ausgewertet.
In der C # -Version in der Frage
stringValue
wird der endgültige Wert der Schleifenvariablen geändert , da die Länge von in der Schleife geändert wird.In VB.NET ist die endgültige Bedingung inklusive, sodass Sie sie
<=
anstelle von<
C # verwenden würden.Die Endbedingungsbewertung in C # hat die Konsequenz, dass selbst wenn sie nicht variiert, aber teuer zu berechnen ist, sie nur einmal vor der Schleife berechnet werden sollte.
quelle
<=
dass ich mit using die gleiche Ausgabe wie der VB-Code ausführen kann. Ich bin jedoch mehr daran interessiert zu wissen, warum ich die Ganzzahlvariable deklarieren musste undVB
nicht. Ich werde meine Frage aktualisieren, um die gleiche Ausgabe anzuzeigen.stringValue
in der Schleife geändert wird, wird der endgültige Wert der Schleifenvariablen geändert.Gemäß der VB.NET- Dokumentation:
Der Wert von
To 10 - stringValue.Length
wird also einmal ausgewertet und wiederverwendet, bis die Schleifen beendet sind.Schauen Sie sich jedoch die Anweisung von c # an
Dies bedeutet im Grunde, dass der Zustand
; i <= 10 - stringValueLength;
jedes Mal erneut bewertet wird.Wie Sie gesehen haben, müssen Sie, wenn Sie den Code replizieren möchten, den endgültigen Zähler in c # deklarieren, bevor Sie die Schleife starten.
quelle
Um das Beispiel verständlicher zu machen, werde ich beide for-Schleifen in C # while-Schleifen konvertieren .
VB.NET
C #
Der Unterschied ist dann:
quelle
for loops
, ich denke, sie sind viel verständlicher. Aus diesem Grund habe ich die Beispiele in "übersetzt"while loops
, um das Verständnis zu erleichtern.Weil das
for
in VB eine andere Semantik ist als dasfor
in C # (oder einer anderen C-ähnlichen Sprache)In VB
for
erhöht die Anweisung speziell einen Zähler von einem Wert zu einem anderen.In C, C ++, C # usw.
for
wertet die Anweisung einfach drei Ausdrücke aus:In VB, Sie müssen eine numerische Variable liefern , die gegen einen Endwert getestet werden kann und bei jeder Iteration erhöht
In C, C ++, C # usw. sind die drei Ausdrücke minimal eingeschränkt. Der bedingte Ausdruck muss als wahr / falsch (oder als Ganzzahl Null / Nicht-Null in C, C ++) ausgewertet werden. Sie müssen überhaupt keine Initialisierung durchführen, Sie können jeden Typ über einen beliebigen Wertebereich iterieren, einen Zeiger oder eine Referenz über eine komplexe Struktur iterieren oder überhaupt nichts iterieren.
In C # usw. muss der Bedingungsausdruck bei jeder Iteration vollständig ausgewertet werden, aber in VB muss der Endwert des Iterators zu Beginn ausgewertet werden und muss nicht erneut ausgewertet werden.
quelle