Подтвердить что ты не робот

Нужно ли явно закрывать StreamReader в С# при его использовании для загрузки файла в строковую переменную?

Пример:

variable = new StreamReader( file ).ReadToEnd();

Это приемлемо?

4b9b3361

Ответ 1

Нет, это не приведет к закрытию StreamReader. Вам нужно закрыть его. Использование делает это для вас (и распоряжается им так, чтобы он GC'd раньше):

using (StreamReader r = new StreamReader("file.txt"))
{
  allFileText = r.ReadToEnd();
}

Или, альтернативно, в .Net 2 вы можете использовать новый файл. статические члены, то вам ничего не нужно закрывать:

variable = File.ReadAllText("file.txt");

Ответ 2

Вы всегда должны распоряжаться своими ресурсами.

// the using statement automatically disposes the streamreader because
// it implements the IDisposable interface
using( var reader = new StreamReader(file) )
{
    variable = reader.ReadToEnd();
}

Или, по крайней мере, называть его вручную:

reader = new StreamReader(file);
variable = reader.ReadToEnd();
reader.Close();

Ответ 3

Вам нужно удалить объекты, которые реализуют IDisposable. Используйте оператор using, чтобы убедиться, что он удаляется без явного вызова метода Dispose.

using (var reader = new StreamReader(file))
{
  variable = reader.ReadToEnd();
}

В качестве альтернативы используйте File.ReadAllText(String)

variable = File.ReadAllText(file);

Ответ 4

Да, всякий раз, когда вы создаете одноразовый объект, вы должны распоряжаться им с помощью инструкции

using (var reader = new StreamReader(file)) {
  variable = reader.ReadToEnd(file);
}

В этом случае, хотя вы можете просто использовать метод File.ReadAllText для упрощения выражения

variable = File.ReadAllText(file);

Ответ 5

Хорошая практика - закрыть StreamReader. Используйте следующий шаблон:

string contents;

using (StreamReader sr = new StreamReader(file)) 
{
   contents = sr.ReadToEnd();
}

Ответ 6

Лучше использовать ключевое слово с; то вам не нужно явно закрывать что-либо.