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

Пример:

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

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


person Matt Ralston    schedule 09.11.2010    source источник


Ответы (6)


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

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

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

variable = File.ReadAllText("file.txt");
person badbod99    schedule 09.11.2010
comment
ReadAllText был добавлен в .Net 2.0 (msdn.microsoft.com/en-us/library/) - person JaredPar; 09.11.2010
comment
Спасибо, Джаред (отредактированный ответ). ТБХ я только недавно столкнулся с этим. Как только вы узнаете один способ, вы, как правило, склонны придерживаться того, что работает. - person badbod99; 10.11.2010
comment
Есть ли разница в производительности при использовании StreamReader.ReadToEnd и File.ReadAllTest? - person Mike; 06.07.2018

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

// 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();
person Dismissile    schedule 09.11.2010
comment
Для тех, кто не знает, что оператор using автоматически позаботится об этом за вас, это может сбить с толку. Нет голосов против, но и нет голосов, потому что это просто не сформулировано для понимания новичком. - person David; 09.11.2010
comment
Добавлен комментарий, чтобы быть полезным - person Dismissile; 09.11.2010
comment
Во втором примере вы вообще не вызываете Dispose(). И нет механизма try-catch, чтобы убедиться, что Close() вызывается. Когда вы добавите оба вызова, try-catch и Dispose(), это не приведет ни к чему другому, кроме using, как в вашем первом пример. - person tanascius; 09.11.2010
comment
Это хорошо объясняет, но не упоминает, как это сделали badbod99 и несколько других, или, альтернативно, в .Net 4 вы можете использовать новый файл. статические элементы, то вам не нужно ничего закрывать - person Matt Ralston; 09.11.2010

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

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

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

variable = File.ReadAllText(file);
person Greg    schedule 09.11.2010
comment
+1, но я бы сказал, что вам не нужно явно закрывать его, если вы используете оператор using, чтобы убедиться, что он удален. +1, потому что это более четко сформулировано, чем ответ Dismissile. Его ответ никак не объясняет, что оператор using будет распоряжаться ресурсами для вас, и кто-то, кто этого не знал, останется чесать в затылке. - person David; 09.11.2010

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

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

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

variable = File.ReadAllText(file);
person JaredPar    schedule 09.11.2010
comment
Это было полезно, хотя badbod99 предоставил еще несколько деталей. Я предполагаю, что эти особенности верны, поскольку я только что начал кодировать вне javascript. - person Matt Ralston; 09.11.2010

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

string contents;

using (StreamReader sr = new StreamReader(file)) 
{
   contents = sr.ReadToEnd();
}
person Bernard    schedule 09.11.2010

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

person Paul Sonier    schedule 09.11.2010