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

Закрыть или продать

Класс StreamReader имеет метод close и dispose. Я хочу знать, какой метод вызывать для очистки всех ресурсов.

Если использовать использование блока, я думаю, что он вызовет его метод dispose. Будет ли достаточно, чтобы очистить все ресурсы.

4b9b3361

Ответ 1

Блок using вызывает Dispose() в экземпляре StreamReader. Вообще говоря, если тип IDisposable, вы должны поместить его в область using.

EDIT: Если вы посмотрите на Close() реализацию StreamReader с помощью Reflector, вы увидите, что он вызывает Dispose(true). Поэтому, если вы не используете область using, вызов Close() вручную будет таким же, как вызов Dispose() в этом конкретном случае.

protected override void Dispose(bool disposing)
{
    try
    {
        if ((this.Closable && disposing) && (this.stream != null))
        {
            this.stream.Close();
        }
    }
    finally
    {
        if (this.Closable && (this.stream != null))
        {
            this.stream = null;
            this.encoding = null;
            this.decoder = null;
            this.byteBuffer = null;
            this.charBuffer = null;
            this.charPos = 0;
            this.charLen = 0;
            base.Dispose(disposing);
        }
    }
}

Ответ 2

Утилизацию достаточно и необходимо, так как она сама вызовет Close all и произведет больше вещей, которые не будут делать Close.

Использование блока - это элегантный способ распоряжаться да, используйте его, когда это возможно.

Ответ 3

Мы все знаем, что System.IO.StreamReader - не единственный класс .NET 4.0+, который реализует метод IDisposable и Close(). Для случая StreamReader в этом вопросе исходный код показывает, что базовый класс TextReader.Close(), TextReader.Dispose() работают одинаковые строки кода. Вы также можете увидеть в коде, что TextReader.Dispose() является реализацией, когда вы вызываете StreamReader.Dispose() (потому что StreamReader не переопределяет эту сигнатуру перегрузки метода Dispose).

Таким образом, вызов StreamReader.Dispose() будет запускать эту унаследованную строку кода, которая вызывает метод защищенного переопределения StreamReader.Dispose(disposing: true), и поэтому StreamReader.Close() вызывать StreamReader.Dispose(disposing: true). Таким образом, для случая StreamReader, Close() и Dispose() выполняются те же строки кода.

Более общий, неклассовый ответ на вопрос Close() или Dispose()?, может означать, что Microsoft имеет довольно ясный документации по реализации IDisposable и шаблона Dispose. Быстрого чтения достаточно, чтобы показать вам, что реализация метода Close() не является требованием шаблона Dispose.

imho причина поиска метода Close() для многих классов, реализующих IDisposable, является результатом соглашения, а не требования.

Кто-то прокомментировал

Закрыть и удалить - что вызывать?

Пример другого класса, который реализует IDisposable с шаблоном Dispose и имеет метод Close(). Выполняет ли Close() тот же код, что и Dispose()? Я не смотрел исходный код, но я бы сказал не обязательно.

Ответ 4

Используемый блок - это все, что вам нужно.

Ответ 5

Используйте Dispose с помощью блока, чтобы гарантировать, что происходит очистка.

Используйте Close, если вы закончите с объектом значительно до конца используемого блока, чтобы быть как можно быстрее при выпуске любых ресурсов.

Оба будут работать рука об руку, хотя последнее может быть избыточным, если вы все равно достигнете конца блока за несколько наносекунд.

Ответ 6

Если вы хотите получить дополнительную информацию о using, посмотрите здесь

Использование

Цитата с сайта:

Оператор using позволяет программист указать, когда объекты которые должны использовать ресурсы их. Объект, предоставленный для использования должен выполнить IDisposable интерфейс. Этот интерфейс предоставляет метод Dispose, который должен освобождать ресурсы объекта.

Ответ 7

Кажется, есть некоторая озабоченность по поводу того, действительно ли Dispose выполняет свою работу.

По существу - вы можете быть достаточно уверены в том, что что-либо в BCL (Base Class Library), которое реализует IDisposable, правильно уберет себя, когда dispose будет вызываться - например, когда выйдет инструкция using объема.

Если возникли проблемы с закрытием потоков, они были бы подобраны к настоящему времени - вы можете доверять IDisposable. Это когда вы используете другие библиотеки, на которые вы полагаетесь на реализацию Dispose.