C# 中的 Empty Dispose() 方法

5

我刚开始学习IDisposable和Dispose()。 我也阅读了有关非托管资源的概念以及Dispose()的几个用例。

但是,在我正在研究的一些源代码中,我发现了一些空的Dispose()方法。我已经阅读了论坛上所有有关空Dispose()的文章,但仍然不理解。

请问,为什么要有一个空的Dispose()方法,并且为什么要在第一时间实现它的存在?

代码:

public class Counter : IDisposable
{
    public double AverageCount { get { return Count.AverageCount; }}
    ...
    public readonly Counter Counter;
    internal ReadOnlyCounter(Counter counter)
    {
        Counter = counter;
    }
    
    public void Dispose() { }
}

1
你确定这种代码适合学习吗?它可能是一个正在进行中的工作或初学者的代码。没有看到“...”,它看起来像一个包装器,我猜有两种不同的 Counter 类型。而且似乎你在getter中打错了字。 - Sinatr
@Sinatr 谢谢您的回复。我对C#非常陌生。我的雇主让我研究一些源代码,但是这些代码中到处都是空的Dispose()。因此,我才提出了这个问题。 - Yeo
1
你有同事可以问问题吗?最好是上面代码的作者或支持者。他们可能有自己的理由,虽然我希望听到类似“哦,谢谢你报告,确实不需要这些”的回答,但我们并不能百分之百确定。这可能是一些奇怪的测试需要实现IDisposable。这可能是一个错误。这可能是代码生成的存根(函数式编程?)...我甚至没有努力去想象。 - Sinatr
@Sinatr 谢谢您的建议。:) 是的,我应该这样做。因为我是新手,我不想问一个看起来很琐碎的问题,这个问题可以在我的自学或社区里找到答案。 - Yeo
2个回答

9
在给定的示例中,它完全没有任何作用。
在某些情况下,空的Dispose()存在是因为该类型以多态方式使用,并且实现相同模式的某些类型可能需要处理,其中MemoryStream是一个很好的例子(对于许多Stream类型,需要处理,因此在基本的Stream类型上强制执行它很有用,但是:MemoryStream在这里没有任何有趣的内容)。
如果空的Dispose()方法是虚拟的,它可能更有意义,但是再次:这涉及到多态性。

谢谢您的回答。我现在明白了。 - Yeo

1

另一个实现IDisposable的原因是可以在using块中使用代码,这可能使业务逻辑更易于阅读。

using(new Counter())
{
     // Some code relying on this counter
}

但是由于每个读者都会假定在闭合括号上调用一些代码,并且会惊讶地发现没有任何代码被调用,我不知道这是否是一个好的理由。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接