在使用 MD5CryptoServiceProvider
时,我发现它可能需要被释放,因为它继承于实现了 IDisposable
的 HashAlgorithm
类。然而,文档中的示例 没有对其进行释放。
我的问题是为什么 HashAlgorithm
类实现了 IDisposable
?散列不只是在内存中进行的某些计算吗?散列过程中可能使用哪些非托管资源?
在使用 MD5CryptoServiceProvider
时,我发现它可能需要被释放,因为它继承于实现了 IDisposable
的 HashAlgorithm
类。然而,文档中的示例 没有对其进行释放。
我的问题是为什么 HashAlgorithm
类实现了 IDisposable
?散列不只是在内存中进行的某些计算吗?散列过程中可能使用哪些非托管资源?
您可以查看源代码
[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
调用Dispose
来释放。在使用后,您必须正确地处理和释放此句柄。
[System.Security.SecurityCritical]
protected override bool ReleaseHandle()
{
FreeHash(handle);
return true;
}
这个方法是基于SafeHandle
类的抽象ReleaseHandle()
方法的重写。你可以在MSDN上了解更多有关这个类的信息,基本上这个类是任何操作系统资源的包装器。
它包含一个关键终结器,确保句柄被关闭,并且保证在意外的AppDomain卸载期间运行,即使在假定平台调用是处于损坏状态的情况下也是如此。
MD5CryptoServiceProvider
对象? - KeyBoredSafeHashHandle
是一个非托管句柄的示例,它是通过P/Invoke
调用创建的,请查看 sources 中的以下方法。也许它不是操作系统句柄,而只是非托管引用,必须正确释放。 - Pavel AnikhouskiMD5CryptoServiceProvider
,因为它正在释放由_safeHashHandle
使用的托管资源(如果有的话)并调用基类Dispose
,如上面的示例所示。所有未受管的资源将由CLR释放,因为基本的SafeHandle
有一个 Finalize 方法。 - Pavel Anikhouski