Как написать код для освобождения управляемых / неуправляемых ресурсов в методе Destructor / Dispose - PullRequest
0 голосов
/ 12 марта 2019

Я новичок в C #, я на самом деле понимаю концепцию деструктора и дипозиметрического метода и разницу между ними и тем, как на самом деле GC вызывается / предотвращается от этих операций.Но когда я пытаюсь понять, что на самом деле мы выпускаем внутри этих методов, я застреваю.

Во-первых, определение пустого деструктора или вывода на консоль ничего хорошего не даст для освобождения неиспользуемой памяти.Итак, что я должен написать внутри деструктора, либо сделать поля класса пустыми или как?Я знаю, что GC позаботится об управляемых ресурсах, так что, если я столкнулся с неуправляемыми ресурсами

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

class Test : IDisposable
{
    private bool isDisposed = false;

    ~Test()
    {
       Dispose(false);
    }

    protected void Dispose(bool disposing)
    {
       if (disposing)
       {
          // Code to dispose the managed resources of the class
       }
       // Code to dispose the un-managed resources of the class

       isDisposed = true;
    }

    public void Dispose()
    {
       Dispose(true);
       GC.SuppressFinalize(this);
    }
}

Я понимаю пример, но какой код должен находиться в закомментированных строках внутри метода dispose ( // Код для удаления управляемых ресурсов класса & // Код для удаления неуправляемых ресурсов класса ).Кто-нибудь может дать мне пример, который бы разрешил мои сомнения

1 Ответ

2 голосов
/ 12 марта 2019

Я понимаю пример, но какой код должен находиться в закомментированных строках

Посмотрите, каждый управляемый ресурс (т. Е. Выделенный .Net, который не использует неуправляемый ресурс под капотом) освобождаетсяиспользуя GC и не требует никакой утилизации.Все, что нужно, - это unmanaged memory тех, кто был распределен через вызовы Win32 API или любой неуправляемый внешний код.

Теперь, чтобы ответить на ваш вопрос, ответ заключается в том, что вы должны поместить код для освобождения этих неуправляемых объектов в Dispose, основываясь на используемом вами внешнем коде или API, должен быть способ (например,метод) освободить память.

Может возникнуть еще один вопрос, теперь, когда нужно распоряжаться только неуправляемым кодом, зачем есть раздел для размещения управляемых ресурсов?
Это потому, что этот управляемый ресурс внутренне зависит от неуправляемого ресурса, вызывая Dispose вы освобождаете эту память, управляемый код обработал код выпуска для вас (в Dispose).Примером этого может быть FileStream

...