StreamReader и переменная в цикле while в C#
Если создать текстовый файл Test:
Петя
Вася
Ваня
и написать такой код:
using System;
using System.IO;
namespace Test
{
class Program
{
static void Main()
{
StreamReader a = new StreamReader("C:\\Users\\Admin\\Desktop\\Test.txt");
string line;
while ((line = a.ReadLine) != null)
{
Console.WriteLine(line);
}
}
}
}
, то на консоль выведутся все 3 имени, а если написать такой код:
using System;
using System.IO;
namespace Test
{
class Program
{
static void Main()
{
StreamReader a = new StreamReader("C:\\Users\\Admin\\Desktop\\Test.txt");
while (a.ReadLine != null)
{
Console.WriteLine(a.ReadLine());
}
}
}
}
, то выведется только Вася. Почему такая разница? Что делает программа во втором случае?
Ответы (1 шт):
ReadLine() читает из файла одну строку.
На строчке while (a.ReadLine() != null) будет прочитана первая строка.
На строчке Console.WriteLine(a.ReadLine()) — вторая. Именно она и будет напечатана.
Затем снова будет прочитана строка в while, цикл будет продолжен, но следующий вызов WrieteLine напечатает уже пустую строку, потому что ReadLine() вернёт null.
Настоящая проблема здесь в том, что ReadLine() это метод с побочным эффектом, поэтому его нельзя вызывать два или три раза и рассчитывать, что он вернёт тот же самый результат. Первый способ это стандартный подход в таких случаях: вызываем один раз, сохраняем в переменную, и затем проверяем уже её.