Нет, это не будет более эффективным. Тем не менее, я бы переписал его так, чтобы в любом случае объявить его вне цикла:
byte[] buffer = new byte[32768];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
Как правило, я не фанат использования побочных эффектов в условиях, но по сути метод Read
дает вам два бита данных: достиг ли вы конца потока и сколько вы прочитал. Цикл while теперь говорит: «Хотя нам удалось прочитать некоторые данные ... скопировать их».
Это немного похоже на использование int.TryParse
:
if (int.TryParse(text, out value))
{
// Use value
}
Опять вы используете побочный эффект вызова метода в условии. Как я уже сказал, у меня нет привычки делать это за исключением для этого конкретного шаблона, когда вы имеете дело с методом, возвращающим два бита данных.
То же самое происходит при чтении строк из TextReader
:
string line;
while ((line = reader.ReadLine()) != null)
{
...
}
Возвращаясь к исходному вопросу: если переменная будет инициализироваться на каждой итерации цикла и , она будет использоваться только в теле цикла, я почти всегда объявляю ее в петля. Единственное незначительное исключение здесь - это если переменная захватывается анонимной функцией - в этот момент это изменит поведение, и я выберу любую форму, которая дала мне желаемое поведение ... но это почти всегда "объявление внутри" "в любом случае.
РЕДАКТИРОВАТЬ: Когда дело доходит до области видимости, приведенный выше код действительно оставляет переменную в большем объеме, чем нужно ... но я считаю, что это делает цикл более четким. Вы всегда можете решить эту проблему, введя новую область видимости, если хотите:
{
int read;
while (...)
{
}
}