为什么 HashAlgorithm class 实现 IDisposable?

Why does the HashAlgorithm class implement IDisposable?

在使用 MD5CryptoServiceProvider 时,我发现它可能需要处理掉,因为它继承自 HashAlgorithm class,它实现了 IDisposable。然而,the example in the docs并没有处理它。

我的问题是为什么 HashAlgorithm class 实现 IDisposable ?散列不只是一些发生在内存中的计算吗?散列中可能使用哪种非托管资源?

你可以看看sources

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

它正在处理内部 SafeHashHandle 实例,用于包装非托管资源(操作系统句柄)并从基础 HashAlgorithm class 调用 Dispose。您必须在使用后妥善处理并释放此句柄

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

此方法覆盖了基础 SafeHandle class 中的抽象 ReleaseHandle() 方法。您可以在 MSDN 阅读更多关于这个 class 的信息,基本上这个 class 是任何操作系统资源的包装器

It contains a critical finalizer that ensures that the handle is closed and is guaranteed to run during unexpected AppDomain unloads, even in cases when the platform invoke call is assumed to be in a corrupted state.