почему мы ставим 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 вручную.


без 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
{
    sr.Dispose();
}

это гарантирует, что что бы ни случилось,sr утилизируются (очищены). Всякий раз, когда создается объект, реализующий IDisposable интерфейс лучше всего обернуть его в using построить, чтобы убедиться, что он очищается и освобождает любые дорогие или дефицитные ресурсы как можно быстрее.


иногда это важно, что мы Dispose объектов после того, как мы закончили с ними.

обертывание конструкции объекта в using блок означает, что удаление обрабатывается автоматически, как только код в фигурных скобках будет завершен.

В случае StreamReader чтение текстового файла, это важно, так как файл заблокирован системой во время чтения StreamReader. Снятие блокировки позволяет другим процессам изменять или удалять файл.


using заявление гарантировал, что Dispose() будет вызван метод, и Dispose() звонки stream.Close()


вам не нужно использовать использование, но это удобный способ быть абсолютно уверенным, что объект правильно удален. Вы можете сделать это без использования, если вы уверены, что всегда распоряжаетесь объектом в конце ( using a, наконец, нормальный способ ). Если есть конкретные причины, по которым вы хотите сохранить объект дальше, вы можете это сделать.

однако, вероятно, что-то с вашей структурой кода, если вы пытаетесь это сделать. Обкладывание использования StreamReader ( и других iDisposible объекты ) в using оператор помогает хорошо структурировать ваш код.