2011-01-05 16 views
9

Szukałem przez jakiś przykładowy kod źródłowy dla aplikacji używam i natknąłem się na tej linii:Użycie "dla (;;)" w aplikacji C#?

for (;;) 
{ 
// The rest of the application's code 
} 

Wygląda na to, aby tworzyć nieskończoną pętlę, ale nie jestem zaznajomiony z " ;; " i niestety jest to bardzo trudne dla Google.

+1

określony duplikat [Co robi pętla C#, gdy brakuje wszystkich wyrażeń.np. dla (;;) {}] (http://stackoverflow.com/questions/697307/what-does-ac-for-loop-do-when-all-the-expressions-are-missing-eg-for) – paxdiablo

Odpowiedz

12

Tak, to nieskończona pętla. Jest to zwykła pętla for bez wyrażenia warunku.

Od documentation for for:

Wszystkie wyrażenia instrukcji for są opcjonalne; Na przykład, następujące oświadczenie jest używany do pisania nieskończoną pętlę:

for (; ;) 
{ 
    // ... 
} 
+0

Dzięki, czy jest to powszechna praktyka (IE: Nie hack?) – JuniorDeveloper1208

+2

Jedna rzecz, na którą należy zwrócić uwagę to, że powinieneś mieć warunek, aby się z niej wyrwać, aby pętla nie była zakończona, zwykle jest zła ... @toleero , to kwestia stylu. Zamiast tego lubię używać pętli 'while (true) {}', która jest bardziej prosta do punktu IMO, ale jedna z nich jest standardową praktyką. –

+1

@ t84 - Dość często, chociaż wiele używa 'while (true) {} dla czytelności. – Oded

7

jest nieskończona pętla.

równa

while (true) { 
} 
0

Ciekawe czytanie w tym artykule:

http://csharpdevelop.blogspot.com/2004/05/writing-infinite-loop.html

Ten rodzaj kodu występuje sporo w wątków roboczych oczekiwania na niektóre do zrobienia. Jest to wspólny wzorzec kodowy . Cały kod w treści pętli jest krytyczny. Warunek "zamknij " musi być często sprawdzany. Oznacza to, że praca musi być krótka . Zwykle jest to jeden mniejszy uchwyt pracy z większego zestawu wykonanej pracy.

1

To jest to samo, co for (<initial>; <condition>; <increment>), po prostu pomijasz początkowy, stan i inkrement. W takim przypadku warunek będzie zawsze uznawany za prawdziwy.

0

Jest to pierwszy wpis w google, jeśli jesteś zainteresowany, I googled C# for ;; I dostałem ten link http://msdn.microsoft.com/en-us/library/ch45axte.aspx Kliknij C# i msdn stwierdza:

Wszystkie wyrażenia instrukcji for są opcjonalne; Na przykład, następujące oświadczenie jest używany do pisania nieskończoną pętlę:

for (;;) { // ... }

1

Tak, to nieskończona pętla.

Wszystkie parametry w rachunku for są opcjonalne i domyślnie Warunkiem true, więc to jest taka sama, jak:

for (;true;) 

lub:

while (true) 
0

Normalny dla pętli te elementy

for (for-initializer ; for-condition ; for-iterator) embedded-statement 

np.

for(int i = 0 ; i < 10 ; i++) { 
    foo(); 
} 

Każdy z tych elementów może zostać pominięty, a ty z lewej for(;;), który jest nieskończoną pętlę.

C# język specification wyraźnie stanowi

Jeżeli za warunek jest pominięty instrukcji for, a następnie ocena określonych wpływów przypisania jakby za warunek zostały zastąpione prawdziwej w powyższym ekspansja.

Więc for(;;) jest taka sama jak for(;true;)

2

Chcę tylko wyjaśnić:

;; nie jest specjalny operator lub coś - to regularne pętli for.

regularne pętli for wygląda tak:

for (do_before_loop**;** finish_loop_when_this_condition_is_false**;** do_after_each_iteration);

jeśli pozostawić wszystkie 3 części opróżnić masz ;; - a ponieważ nie masz warunek wyjścia - to nieskończona pętla.

3

Normalnie piszesz pętli tak:

for (int i = 0; i < 10; i++) 
{ 
// The rest of the application's code 
} 

Teraz, gdy chcesz, aby Twój pętla być nieskończoną jeden, po prostu trzeba usunąć „int i = 0”, stan „i < 10” i inkrementacja "i ++". Jeśli to zrobisz, to w instrukcji for zobaczysz tylko ";;"

for (;;) 
{ 
// The rest of the application's code 
} 
+1

Technicznie, aby pętla była nieskończona, wszystko, co musisz usunąć, to warunek (i <10). –

0

Jest to zwykłe użycie nieskończonej pętli. Używamy tej pętli na wypadek, gdybyśmy nie wiedzieli, ile razy musimy wykonać kod wewnątrz pętli. Dlatego musimy zdefiniować także warunek wyjścia z tej pętli. Oto przykład otrzymywania długą wiadomość z serwera:

for (;;) 
{ 
    //Receive the maximum allowed size of the message 
    //Save(Concatenate) the received data in a variable (TotalReceivedData) 
    // If the length of the received part of the message is equal to zero , break the operation 
    //<Break the loop>if(message.length == 0){break;}</Break the loop> 
} 

A tutaj można użyć twój pełny otrzymał wiadomość przechowywana w zmiennej TotalReceivedData.

Dodałem ten przykład, ponieważ właśnie natknąłem się na taki przypadek.