почему мы ставим using перед streamreader в c#
почему мы ставим перед streamreader
на c#
using (StreamReader sr = new StreamReader("TestFile.txt"))
{
string line;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
8 ответов
блок using в C# очень удобный при работе с одноразовыми предметами. Одноразовые объекты-это объекты, которые могут явно освобождать ресурсы, используемые при вызове dispose. Как мы знаем, сбор мусора .Net является недетерминированным, поэтому вы не можете предсказать, когда именно объект будет собирать мусор.
Подробнее читайте этот пост:понимание блока "использование" в C#
Так что, когда вы закончите использовать StreamReader
он утилизируется должным образом. Кроме того, в случае исключения using
призыв Dispose
прежде чем исключение распространится.
его хорошая практика, чтобы использовать using
синтаксис, когда вы работаете с объектом, который реализует IDisposable
, (где StreamReader
делает), поскольку это гарантирует, что Dispose
метод всегда вызывается и объект утилизировать.
например, в этом случае различные ручки / блокировки будут получены в файле"вопросами и ответами.txt " это может помешать другим людям писать или даже читать этот файл, пока не будет удален stream reader или процесс концы. Другие объекты (например, объекты базы данных) могут использовать подключения к базе данных или сетевые ресурсы, поэтому вы всегда должны избавляться от объектов, как только вы закончите их использовать - оператор using-это просто простой и безопасный шаблон для выполнения при этом.
под крышками, что происходит, похоже на это (ссылка):
StreamReader sr = new StreamReader("TestFile.txt");
try
{
string line;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
finally
{
if (sr != null)
{
((IDisposable)sr).Dispose();
}
}
однако оператор using намного чище (и менее подвержен ошибкам), чем попытка избавиться от IDisposable
вручную.
код переводится компилятором на:
StreamReader sr = new StreamReader("TestFile.txt")
try
{
string line;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
finally
{
sr.Dispose();
}
это гарантирует, что что бы ни случилось,sr
утилизируются (очищены). Всякий раз, когда создается объект, реализующий IDisposable
интерфейс лучше всего обернуть его в using
построить, чтобы убедиться, что он очищается и освобождает любые дорогие или дефицитные ресурсы как можно быстрее.
иногда это важно, что мы Dispose
объектов после того, как мы закончили с ними.
обертывание конструкции объекта в using
блок означает, что удаление обрабатывается автоматически, как только код в фигурных скобках будет завершен.
В случае StreamReader
чтение текстового файла, это важно, так как файл заблокирован системой во время чтения StreamReader. Снятие блокировки позволяет другим процессам изменять или удалять файл.
вам не нужно использовать использование, но это удобный способ быть абсолютно уверенным, что объект правильно удален. Вы можете сделать это без использования, если вы уверены, что всегда распоряжаетесь объектом в конце ( using
a, наконец, нормальный способ ). Если есть конкретные причины, по которым вы хотите сохранить объект дальше, вы можете это сделать.
однако, вероятно, что-то с вашей структурой кода, если вы пытаетесь это сделать. Обкладывание использования StreamReader
( и других iDisposible
объекты ) в using
оператор помогает хорошо структурировать ваш код.