微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 这个IDisposable对我有什么用?

我正在研究“学习计划”并使用Code rush重构工具和我的学习.随着Code rush的最新更新,它一直建议在我的程序中实现Idisposable.我知道MSDN对Idisposable的看法,我对它的作用有一个真正基本的了解,但因为我不知道实现它的所有含义我一直忽略了这个建议.今天我决定更多地了解它并同意推荐.

这是它添加到我的程序中的内容.

class Program : Idisposable
{
    static Service _proxy;

    public void dispose()
    {
        dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void dispose(bool disposing)
    {
        if (disposing)
            if (_proxy != null)
            {
                _proxy.dispose();
                _proxy = null;
            }
    }

    ~Program()
    {
        dispose(false);
    }

所以我的问题就是这个.这样做我需要做些什么来获得Idisposable的优势,还是我需要在代码中做一些事情才能使它工作?我在其上设置了一个断点,并且从未通过调试器到达它,因此要么不需要它,要么我没有按照预期的方式使用它.有人可以说明这对我的影响或我应该如何使用它以便它确实为我做了些什么?

解决方法

在这种情况下,Coderush建议您实现Idisposable,因为您的类封装了一个Idisposable资源(它看到_proxy,虽然这不是一件好事,因为它是静态的). Code rush认为你正在使用的类型应该明确清理,但是你没有提供一种方法来通过你的课程来完成.

话虽这么说,Idisposable是棘手的 – 这是一个生成代码实际上不是一个好的实现(即使_proxy是一个实例变量)的情况.在这种情况下,我建议不要使用析构函数.它会导致GC中的性能问题,在这种情况下,对安全性没有帮助,因为封装的资源应该处理忘记为您调用dispose()的情况.有关详细信息,请参阅my series on IDisposable,特别是encapsulating an IDisposable class.

此外,由于_proxy资源是静态的,因此在给定上述代码时,此类不应实现Idisposable(除非有其他原因这样做).从一个实例中处置静态资源可能会导致问题,至少在一般情况下如此. (在这种情况下,它显然没有问题,但它不是一个好的做法……)通常,静态变量与实例成员的生命周期非常不同,因此自动处理它是不合适的.

原文地址:https://www.jb51.cc/csharp/243848.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐