Почему класс HashAlgorithm реализует IDisposable?

При использовании MD5CryptoServiceProvider я обнаружил, что его, возможно, придется удалить, поскольку он наследуется от класса HashAlgorithm, который реализует IDisposable. Однако пример в документации не Не утилизирую.

У меня вопрос: почему класс HashAlgorithm реализует IDisposable? Разве хеширование - это не просто некоторые вычисления, которые выполняются в памяти? Какие неуправляемые ресурсы могут использоваться при хешировании?


person KeyBored    schedule 28.11.2019    source источник


Ответы (1)


Вы можете ознакомиться с источниками

[System.Security.SecuritySafeCritical] // overrides public transparent member
protected override void Dispose(bool disposing)
{
    if (_safeHashHandle != null && !_safeHashHandle.IsClosed)
        _safeHashHandle.Dispose();
    base.Dispose(disposing);
}

Он удаляет внутренний SafeHashHandle экземпляр, который используется для обертывания неуправляемого ресурса (дескриптора операционной системы) и вызывает Dispose из базового HashAlgorithm класса. Вы должны правильно утилизировать и отпустить эту ручку после использования.

[System.Security.SecurityCritical]
protected override bool ReleaseHandle()
{
    FreeHash(handle);
    return true;
}

Этот метод заменяет абстрактный метод ReleaseHandle() из базового класса SafeHandle. Вы можете узнать больше об этом классе на MSDN, в основном этот класс является оболочкой для любого ресурса операционной системы.

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

person Pavel Anikhouski    schedule 28.11.2019
comment
Спасибо за ответ, Павел. Но подскажите, пожалуйста, какой дескриптор ОС может понадобиться для хеширования? - person KeyBored; 02.12.2019
comment
Кроме того, как вы думаете, в примере в документации следовало удалить объект MD5CryptoServiceProvider? - person KeyBored; 02.12.2019
comment
SafeHashHandle - это пример неуправляемого дескриптора, который создается P/Invoke вызовом, посмотрите следующий метод в источники. Может быть, это не дескриптор ОС, это просто неуправляемая ссылка, которую нужно правильно выпустить. - person Pavel Anikhouski; 02.12.2019
comment
Да, я думаю, что в документах MD5CryptoServiceProvider следует удалить, потому что он удаляет управляемые ресурсы, используемые _safeHashHandle (если есть), и вызывает базовый класс Dispose, согласно приведенному выше образцу. Все неуправляемые ресурсы будут освобождены CLR, поскольку база SafeHandle имеет Завершить метод - person Pavel Anikhouski; 02.12.2019