这个一次性用品对我有什么用?

本文关键字:什么 性用品 一次 | 更新日期: 2023-09-27 18:16:47

我正在做一个"学习程序",并在学习过程中使用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()的情况。有关详细信息,请参阅我的IDisposable系列,特别是封装IDisposable类。

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

在一个正确编写的程序中,在任何给定的时间,对于每个可能具有有意义的IDisposable实现的对象,都将有一些实体负责确保IDisposable。Dispose将在实例最后一次"实际使用"和最终放弃之间的某个时间对该对象调用。一般来说,如果对象Foo要保存对实现IDisposable的对象的引用,则至少应适用以下场景之一:

  1. 其他一些对象也将至少在Foo需要它的时候保持引用,并且将负责对其调用Dispose,因此Foo应该让其他对象负责Dispose。
  2. 保存引用的对象将是最后一个使用IDisposable对象的对象;如果Foo不调用Dispose,那么没有其他函数调用。在这种情况下,Foo必须确保其他对象的Dispose方法在它(Foo)不再需要时被调用,并且在它被放弃之前被调用。处理这个问题最惯用的方法是让Foo实现IDisposable。处置,并使其处置方法对它保存最后有用引用的IDisposable对象调用处置。

在某些情况下,类设计器可能不知道其类是否将保存对IDisposable对象的最后一个有用引用。在某些情况下,这个问题可以通过让类构造函数指定传递给构造函数的IDisposable是"借出"还是"给定"来解决。其他情况可能需要使用引用计数包装器或其他复杂的技术。