【问题标题】:Why does the HashAlgorithm class implement IDisposable?HashAlgorithm 类为什么要实现 IDisposable?
【发布时间】:2020-03-23 19:33:02
【问题描述】:

在使用MD5CryptoServiceProvider 时,我发现它可能需要处理,因为它继承自实现IDisposableHashAlgorithm 类。但是,the example in the docs 没有处理它。

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

【问题讨论】:

    标签: c# .net hash idisposable


    【解决方案1】:

    你可以看看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 调用Dispose。使用后必须妥善处理和释放此句柄

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

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

    它包含一个关键的终结器,确保句柄是 关闭并保证在意外的 AppDomain 卸载期间运行, 即使假设平台调用调用在 损坏的状态。

    【讨论】:

    • 感谢您的回答,帕维尔。但是你能告诉我哈希可能需要哪个操作系统句柄吗?
    • 另外,您认为文档中的示例应该处理 MD5CryptoServiceProvider 对象吗?
    • SafeHashHandle 是非托管句柄的例子,它是由P/Invoke 调用创建的,请看sources 中的以下方法。也许它不是操作系统句柄,它只是非托管引用,必须正确释放。
    • 是的,我认为应该在文档中处理MD5CryptoServiceProvider,因为它正在处理_safeHashHandle(如果有)使用的托管资源并调用基类Dispose,根据上面的示例。所有非托管资源都将由 CLR 释放,因为基 SafeHandle 有一个 Finalize 方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2012-01-19
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2014-02-11
    相关资源
    最近更新 更多