четверг, 26 мая 2022 г.

Интерфейс IDisposable в C#

 Эта статья о паттерне IDisposable является продолжением моей предыдущей статьи «Object LifeTime в .NET Framework» .


IDisposable — это интерфейс, который содержит единственный метод Dispose() для высвобождения неуправляемых ресурсов, таких как файлы, потоки, подключения к базе данных и т. д.

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

Ниже приведена реализация IDisposable в классе:

IDisposable в классе

В коде есть несколько моментов, на которые следует обратить внимание:

  • ~DisposableClass()

    Мы можем определить, что это метод деструктора по символу ~ (тильда). На самом деле он преобразуется в метод Finalize, потому что в C# компилятор переводит деструктор в метод Finalize(). См. следующий рисунок, показывающий метод Finalize в средстве ildasm.exe для деструктора ~DisposableClass (который определен в предыдущем примере кода).

    Одноразовый класс

    Возникает вопрос: почему мы используем метод Finalize, если мы уже используем метод Dispose в коде для очистки управляемых ресурсов?

    Ответ: Метод Dispose явно реализуется программистом, и есть вероятность того, что программист не сможет или забудет избавиться от неуправляемых ресурсов, поэтому метод Finalize следует вызывать для более безопасной стороны, чтобы предотвратить утечку памяти. Если метод Dispose не вызывается по какой-либо причине, деструктор будет вызываться сборщиком мусора, но когда сборщик мусора будет вызывать метод Finalize, не определяется. Сборщик мусора может вызывать его в любое время, когда требуется больше памяти, или когда программа завершает работу, или в любое время при некоторых других условиях.

  • GC.SuppressFinalize()

    Если вызывается метод Dispose, то объект не нужен. Метод переопределения Finalize() должен вызываться сборщиком мусора, а тот Dispose(), который явно реализован в коде, очистит все неуправляемые ресурсы. Именно поэтому ГК. Метод SuppressFinalize() вызывается для предотвращения запуска финализатора сборщиком мусора.

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

    Метод Dispose вызывается автоматически при использовании оператора using. Все объекты, которые могут реализовать интерфейс IDisposable, могут реализовать оператор using.
    1. используя  (TextWriter txt = File.CreateText («myfile.txt»)  
    2. {  
    3.    txt.WriteLine («Комментарии начаты:»);  
    4. }  
    Вы можете использовать средство ildasm.exe, чтобы проверить, как метод Dispose вызывается внутри при использовании оператора using.

Я надеюсь, что эта статья будет полезна для вас. Ваши отзывы и предложения всегда приветствуются.

Комментариев нет:

Отправить комментарий

Паттерн 'Репозиторий' в ASP.NET

  Последнее обновление: 1.11.2015         Одним из наиболее часто используемых паттернов при работе с данными является паттерн 'Репозито...