【问题标题】:What is the implication of not using X509Store.Close method?不使用 X509Store.Close 方法意味着什么?
【发布时间】:2013-08-27 21:11:14
【问题描述】:

如果我一直初始化X509Store 证书存储并且不使用他们的Close() 方法,这意味着什么?

在代码示例given in documentation 中,他们不使用try..finally 块来调用Close 方法。如果这个证书存储是需要释放的,为什么设计为从IDisposable 派生的类的 API 或者为什么这个类没有在对象超出范围时调用的隐式析构函数?

【问题讨论】:

    标签: .net x509certificate x509certificate2


    【解决方案1】:

    在 .NET 4.6 中,X509Store 被修改,现在实现 IDisposable

    Dispose 实现正在调用Close()

    来自Microsoft Docs

    从 .NET Framework 4.6 开始,此类型实现 IDisposable 接口。使用完该类型后,应直接或间接将其丢弃。

    【讨论】:

    【解决方案2】:

    在内部,Close 方法释放指向非托管对象的句柄。

    public void Close()
    {
        if ((this.m_safeCertStoreHandle != null) && !this.m_safeCertStoreHandle.IsClosed)
        {
            this.m_safeCertStoreHandle.Dispose();
        }
    }
    

    我宁愿调用 Close 方法来避免内存泄漏。

    【讨论】:

    • 他们为什么不在析构函数中这样做,这实际上是我的问题。顺便说一句,您从哪里获得源代码?
    • 在 .Net 中,IDisposable 优于析构函数。请参阅:stackoverflow.com/questions/456213/destructor-vs-idisposable 我使用 Ilspy 反编译器获得了代码。 ilspy.net
    • 那么你认为为什么这个 API 不是用 IDisposable 设计的?
    • 如果不深入了解来源,我无法判断。即使是 Microsoft 代码也不完美。但是对你来说,调用 Close() 比完整的 using 或 try/finally 块更短! :-)
    猜你喜欢
    • 2011-06-28
    • 1970-01-01
    • 2014-02-23
    • 2013-04-11
    • 2023-03-10
    • 2011-08-28
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多