Я не понимаю использование циклов while (true) и for (;;) в C #! - PullRequest
3 голосов
/ 09 декабря 2011

пример кода для Пока (true) цикл:

    public void HandleConnection()
    {
        TcpClient tcpClient = tcpListener.AcceptTcpClient();
        NetworkStream networkStream = tcpClient.GetStream();
        while (true)   /**Don't understand this while(true) loop**/
        {
            buffer = new byte[1024];
            n = networkStream.Read(buffer, 0, buffer.Length);
            if (n == 0)
            {
                break;
            }

        }
    }

Пример кода для для (;;) цикл:

     public void readLine(NetworkStream inputStream)
     {
        using (StreamReader reader = new StreamReader(inputStream))
        {

            char[] buffer = new char[128];
            int n;

            for (; ; ) /**Don't understand this for(; ;) loop**/
            {
                n = reader.Read();
                if (n == -1 || n == '\n')
                {
                    break;
                }
        }
      }

Кто-нибудь может дать четкое понимание вышеприведенных операторов цикла со ссылкой на приведенный пример кода?Спасибо за вашу помощь!

Ответы [ 9 ]

4 голосов
/ 09 декабря 2011

Первый должен быть легким:

while(true)

Это просто означает, что вы должны выполнять бесконечный цикл (если в цикле нет break). Это значение должно быть понятно, если вы просто прочитаете его как обычную английскую строку текста.

Другой немного сложнее объяснить:

for( ; ; )

Обычно часть внутри ( ... ) содержит три оператора: (1) начальная точка, (2) условие выхода, (3) приращение. Без этих трех утверждений он просто будет бесконечно повторяться. Главным образом потому, что нет условия выхода.

4 голосов
/ 09 декабря 2011

Это бесконечные петли. В первом случае вы выполняете бесконечный цикл чтения из сетевого потока, а во втором случае вы читаете из файлового потока.

В обоих случаях вы можете использовать break, когда выполняется какое-либо условие, чтобы разорвать цикл.

3 голосов
/ 09 декабря 2011

Самым идиоматичным способом реализации такого цикла является IMO цикл do-while.Таким образом, вам не нужен несколько запутанный бесконечный цикл с оператором break.

Например, вашим первым примером может стать:

int n;
do 
{
    byte[] buffer = new byte[1024];
    n = networkStream.Read(buffer, 0, buffer.Length);
} while (n != 0);

Цикл do-while всегда выполняет циклbody и проверяет условие while после каждой итерации.

3 голосов
/ 09 декабря 2011

Есть оба цикла, которые никогда не прекратятся. while(true) просто потому, что true всегда будет истинным, последнее потому, что не указано условие завершения.

Они просто используются для многократного выполнения кода до тех пор, пока цикл не прервется в другом месте, то есть когда n равно нулю для первого и когда n равно -1 или ' \ n '(символ новой строки) в последнем.

Первый может быть переписан как:

    n = 1;

    while (n)
    {
        buffer = new byte[1024];
        n = networkStream.Read(buffer, 0, buffer.Length);
    }
2 голосов
/ 09 декабря 2011

В обоих случаях вы можете переключать while и for. Оба будут зациклены навсегда, если вы не сделаете перерыв внутри. Я предпочитаю время (правда) с перерывом, чем для.

2 голосов
/ 09 декабря 2011

Оба эти синтаксиса являются способом реализации бесконечных циклов .

В то время как цикл показывает чтение, пока в потоке нечего читать.

Для цикла повторяйте чтение, пока не получите символ новой строки или -1.

1 голос
/ 09 декабря 2011

C # имеет две основные конструкции цикла.Операторы while и для позволяют проверить условие выхода из цикла в начале цикла.Оператор do-while позволяет проверить условие выхода из цикла в конце цикла.

Но что вы делаете, когда хотите проверить условие выхода из цикла в middle ?

Вы просто используете одно из этих утверждений и не проверяете в них условие выхода из цикла:

for (;;) {
    statements;
    if (exitExpression) break;
    statements;
}
1 голос
/ 09 декабря 2011

Код объяснения:

public void HandleConnection()
{
    int n;
    byte[] buffer = new byte[1024];
    TcpClient tcpClient = tcpListener.AcceptTcpClient();
    NetworkStream networkStream = tcpClient.GetStream();
    networkStream.Write(buffer, 0, buffer.Length);
    while (true)   // This is a infinity loop and does never stop ( same in the for (;;) loop )
    {
        buffer = new byte[1024];
        n = networkStream.Read(buffer, 0, buffer.Length);
        // Check if there has been data on the network stream
        if (n == 0)
        {
            // No data has been read, exit from the infinity loop
            break;
        }

    }
}
0 голосов
/ 09 декабря 2011

Пока (true) бесконечный цикл.Цикл будет работать до тех пор, пока networkStream.Read(buffer, 0, buffer.Length); не вернет 0. Если будет возвращено значение 0, цикл прервется:

  if (n == 0)
  {
    break;
  }

То же самое касается цикла 'for'Петля снова будет работать бесконечно.Приложение выйдет из цикла, когда reader.Read(); вернет значение -1 или '\ n' .Важно помнить, что при использовании оператора двойной логики ИЛИ (n == -1 || n == '\ n') вместо одного (n == -1 | n == '\ n '), достаточно для ввода оператора if, если первое логическое утверждение истинно.Если первое логическое утверждение верно, второе даже не проверяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...