Saya sedang dalam proses migrasi proyek dari Visual Basic ke C # dan saya harus mengubah cara a for
deklarasi loop yang digunakan.
Di VB.NET, for
loop dideklarasikan di bawah ini:
Dim stringValue As String = "42"
For i As Integer = 1 To 10 - stringValue.Length
stringValue = stringValue & " " & CStr(i)
Console.WriteLine(stringValue)
Next
Output mana:
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
Di C # for
loop dideklarasikan di bawah ini:
string stringValue = "42";
for (int i = 1; i <= 10 - stringValue.Length; i ++)
{
stringValue = stringValue + " " + i.ToString();
Console.WriteLine(stringValue);
}
Dan hasilnya:
42 1
42 1 2
42 1 2 3
Ini jelas tidak benar jadi saya harus mengubah kode sedikit dan memasukkan variabel integer yang akan menahan panjang string.
Silakan lihat kode di bawah ini:
string stringValue = "42";
int stringValueLength = stringValue.Length;
for (int i = 1; i <= 10 - stringValueLength; i ++)
{
stringValue = stringValue + " " + i.ToString();
Console.WriteLine(stringValue);
}
Dan hasilnya:
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
Sekarang pertanyaan saya menyelesaikan sekitar bagaimana Visual Basic berbeda dengan C # dalam hal Visual Basic menggunakan stringValue.Length
kondisi dalam for
loop meskipun setiap kali loop terjadi panjang string berubah. Sedangkan di C # jika saya menggunakan kondisi stringValue.Length
dalam for
loop itu mengubah nilai string awal setiap kali loop terjadi. Kenapa ini?
Jawaban:
Dalam C #, kondisi batas loop dievaluasi pada setiap iterasi. Di VB.NET, ini hanya dievaluasi saat masuk ke loop.
Jadi, dalam versi C # di pertanyaan, karena panjangnya
stringValue
diubah dalam perulangan, nilai variabel perulangan terakhir akan berubah.Dalam VB.NET, kondisi akhir inklusif, sehingga Anda akan menggunakan
<=
bukannya<
di C #.Evaluasi kondisi akhir di C # memiliki konsekuensi bahwa meskipun tidak bervariasi tetapi mahal untuk dihitung, harus dihitung sekali sebelum loop.
sumber
<=
memungkinkan saya untuk mengulang dan memiliki keluaran yang sama dengan kode VB. Namun, saya lebih tertarik untuk mengetahui mengapa saya harus mendeklarasikan variabel integer danVB
saya tidak perlu melakukannya. Saya akan memperbarui pertanyaan saya untuk menunjukkan hasil yang sama.stringValue
sedang diubah dalam loop, nilai variabel loop terakhir akan berubah.Menurut dokumentasi VB.NET :
Jadi, nilai dari
To 10 - stringValue.Length
dievaluasi sekali dan digunakan kembali hingga loop keluar.Namun, lihat c # untuk pernyataan
Yang pada dasarnya berarti bahwa kondisi
; i <= 10 - stringValueLength;
tersebut dievaluasi kembali setiap kali.Jadi, seperti yang Anda lihat, jika Anda ingin mereplikasi kode, Anda perlu mendeklarasikan penghitung terakhir di c # sebelum memulai loop.
sumber
Untuk membuat contoh lebih mudah dimengerti, saya akan mengonversi kedua for loop menjadi C # while loop .
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++; }
Perbedaannya kemudian:
sumber
for loops
saya, saya pikir mereka jauh lebih bisa dimengerti. Inilah mengapa saya 'menerjemahkan' contohwhile loops
, untuk membantu pemahaman.Karena
for
di VB adalah semantik yang berbeda darifor
di C # (atau bahasa C-like lainnya)Dalam VB,
for
pernyataan secara khusus menaikkan penghitung dari satu nilai ke nilai lainnya.Di C, C ++, C #, dll.,
for
Pernyataan itu hanya mengevaluasi tiga ekspresi:Di VB, Anda harus menyediakan variabel numerik yang dapat diuji terhadap nilai terminal dan bertambah pada setiap iterasi
Dalam C, C ++, C #, dll., Ketiga ekspresi tersebut dibatasi secara minimal; ekspresi kondisional harus bernilai true / false (atau integer nol / bukan nol di C, C ++). Anda tidak perlu melakukan inisialisasi sama sekali, Anda dapat mengulang tipe apa pun pada rentang nilai apa pun, mengulang penunjuk atau referensi pada struktur yang kompleks, atau tidak mengulangi apa pun sama sekali.
Jadi, di C #, dll., Ekspresi kondisi harus sepenuhnya dievaluasi pada setiap iterasi, tetapi di VB, nilai terminal dari iterator harus dievaluasi di awal, dan tidak perlu dievaluasi lagi.
sumber