Bir while döngüsü bir koşul doğru kaldığı sürece gövdesini tekrarlar. Kaç yinelemeye ihtiyacınız olduğunu önceden bilmediğinizde kullanın: bir bakiye hedefe ulaşana, bir kuyruk boşalana ya da girdi bitene kadar devam edin.
Çıktı:
Year 1: 1070.00
Year 2: 1144.90
Year 3: 1225.04
Year 4: 1310.80
Year 5: 1402.55
Year 6: 1500.73
Goal reached after 6 years
Koşul, ilki dahil her yinelemeden önce kontrol edilir. savings hedefi zaten karşılasaydı gövde hiç çalışmaz ve program "after 0 years" yazdırırdı. Döngü, gövdenin koşulun okuduğu bir şeyi değiştirmesine bağlıdır; burada savings her yıl büyür ve sonunda savings < goal false olur.
do while: En Az Bir Kez Çalıştır
Bir do while döngüsü testi sona taşır, bu yüzden gövde her zaman en az bir kez çalışır:
Çıktı:
Attempt 1: got 7
Attempt 2: got 4
Attempt 3: got 1
Done after 3 attempts
code'un ilk değeri ancak gövde bir kez çalıştıktan sonra var olur; bir do while'ın tam olarak uyduğu durum budur. İki sözdizimi ayrıntısı insanları yakalar:
while (code != 1)'den sonraki noktalı virgül zorunludur. Unutmak bir derleme hatasıdır.- Koşulda kullanılan değişkenler
do'dan önce bildirilmelidir. Süslü parantezlerin içinde bildirilen bir değişken, koşul çalıştığında kapsam dışındadır, bu yüzdendo { int code = ...; } while (code != 1);derlenmez.
Aynı döngü while ile yazıldığında ya döngüden önce çoğaltılmış bir ilk çağrı ya da ilk geçişi zorlayan yapay bir başlangıç değeri gerekir. do while "dene, sonra yeniden denemeye karar ver" fikrini doğrudan ifade eder.
Bir Bitiş Kelimesine Kadar Girdi Okumak
Bir durdurma kelimesine ya da girdi bitene kadar satır okumak ders kitabı while döngüsüdür. Console.ReadLine() başka girdi olmadığında null döndürür, bu yüzden ikisini de test edin:
Çıktı:
skipping "abc": not a number
3 amounts, total 49.50
(line = Console.ReadLine()) != null sonraki satırı atar ve tek bir ifadede test eder; !=, ='den daha sıkı bağlandığı için atamanın etrafındaki parantezler zorunludur. Döngü done'da durur, bu yüzden ondan sonraki 99 hiç okunmaz. decimal.TryParse abc'yi istisna fırlatmadan reddeder ve continue sonraki satıra atlar. null kontrolü olmadan girdinin sonuna ulaşmak TryParse'a sonsuza dek null verirdi, çünkü ReadLine null döndürmeye devam eder.
Bir do while, sorunun en az bir kez görünmesi gereken sor ve doğrula kalıbına uyar:
Çıktı:
Enter your age:
"-4" is not a valid age
Enter your age:
"fifteen" is not a valid age
Enter your age:
Age accepted: 15
Soru döngünün içindedir, bu yüzden reddedilen her cevaptan sonra tekrarlanır; age de döngüden sonraki kodun kullanabilmesi için do'dan önce bildirilmiştir. Klavye başında bir kullanıcıyla her cevap konsolda sorusundan sonra görünür; burada olduğu gibi yönlendirilmiş girdiyle yalnızca programın kendi çıktısı gösterilir.
break ile while (true)
Bazen doğal çıkış noktası gövdenin ortasındadır: bir miktar işten sonra, geri kalanından önce. Döngüyü while (true) olarak yazın ve break ile çıkın:
Çıktı:
processing: resize photo
processing: send email
stop signal received
1 job(s) left in the queue
Dequeue sonraki işi kuyruğun önünden alır ve döngü durdurma işaretini görür görmez çıkar, bu yüzden son iş kuyrukta kalır. Çıkış açık ve gövdenin başına yakınsa while (true) kötü bir kod kokusu değildir. Uzun bir gövdeye dağılmış birkaç break olduğunda öyle olur; o zaman adlandırılmış bir bool koşul ya da return içeren bir metot daha kolay takip edilir. break ve continue sayfası iç içe döngülerden çıkmayı ele alır.
Hiç Bitmeyen Döngüler
İstenmeyen bir sonsuz döngünün üç nedenden biri vardır.
Gövde koşulu hiç değiştirmez. Sayaç hiç artırılmaz ya da yanlış değişken artırılır:
int i = 0;
while (i < 5)
{
Console.WriteLine(i); // i++ forgotten: prints 0 forever
}
Koşuldan sonra bir noktalı virgül. Noktalı virgül döngünün tüm gövdesidir ve altındaki blok döngüden sonra çalışır (döngü ise hiç bitmez):
while (retries < 3); // warning CS0642: Possible mistaken empty statement
{
retries++;
}
Hedefinin üzerinden atlayan bir koşul. Değişken adımlarla ilerlerken != test etmek durma değerinin üzerinden atlayabilir. while (x != 10) x += 3; 0, 3, 6, 9, 12 diye gider ve 10'u geçip gider (10'a ancak tesadüfen, int taşıp milyarlarca adım sonra başa sardıktan sonra denk gelir). Adım 1 olmadığında != yerine < ya da > ile test edin. Aynısı nadiren tam bir hedefe denk gelen double değerleri için de geçerlidir: while (x != 1.0) x += 0.1; hiç bitmez.
while, do while ve for Arasında Seçim
| Durum | Döngü |
|---|---|
| Bilinen sayıda yineleme ya da bir indeks | for |
| Bir koleksiyonun her elemanı | foreach |
| Bir koşul sağlandığı sürece tekrarlamak, belki sıfır kez | while |
| Koşulun anlam kazanması için gövdenin bir kez çalışması gerekir | do while |
| Gövdenin ortasında çıkış testi | break ile while (true) |
Her for döngüsü bir while döngüsü olarak yeniden yazılabilir ve tersi de geçerlidir; seçim, hangisinin döngünün mantığını okuyucunun beklediği yere koyduğuyla ilgilidir. Sayaç, test ve adımın hepsi varsa for onları tek satırda tutar. Döngü gövdenin içinde değişen bir durumla yönetiliyorsa while bunu söyler.
Sıkça Sorulan Sorular
C#'ta while ile do while arasındaki fark nedir?
Bir while döngüsü koşulunu her yinelemeden önce kontrol eder, bu yüzden gövdesi sıfır kez çalışabilir. Bir do { } while (condition); döngüsü her yinelemeden sonra kontrol eder, bu yüzden gövdesi her zaman en az bir kez çalışır. Koşulun test ettiği değeri ilk geçiş üretiyorsa, örneğin girdi okuyup sonra doğrularken, do while kullanın.
C#'ta do while döngüsünün sözdizimi nedir?
do { body } while (condition);. Kapanış parantezinden sonraki noktalı virgüle dikkat edin: zorunludur ve unutmak bir derleme hatasıdır. Koşul gövdede atanan değişkenleri kullanabilir, ama bunlar do'dan önce bildirilmelidir, çünkü gövdenin süslü parantezleri ayrı bir kapsamdır.
C#'ta while (true) nasıl yazılır?
while (true) { ... }, içindeki bir şey break, return ya da bir istisnayla onu terk edene kadar sonsuza dek döner. Çıkış testi gövdenin ortasına aitse, örneğin bir satır okuyup boş olduğunda durmak gibi, doğal şekil budur.
C#'ta kullanıcı bir kelime yazana ya da girdi bitene kadar nasıl girdi okunur?
Girdinin sonunda null döndüren Console.ReadLine() üzerinde döngü kurun: string line; while ((line = Console.ReadLine()) != null && line != "done") { ... }. Koşulun içindeki atama, sonraki satırı okur ve tek adımda test eder.
C# while döngüm neden hiç bitmiyor?
Genellikle gövde, koşulun test ettiği şeyi hiç değiştirmez (unutulmuş bir i++) ya da koşuldan hemen sonra bir noktalı virgül vardır: while (count < 10); sonsuza dek dönen boş gövdeli bir döngüdür. Derleyici ikinci durum için CS0642, Possible mistaken empty statement uyarısı verir.