什么时候不应该实现IDisposable?

Alf*_*fie 3 .net c# memory-leaks memory-management idisposable

首先,对不起,如果这被认为是重复 - 我知道这是一个共同的话题,但我看了,但没有找到一个满意的答案.

有很多的问问题时使用IDisposable,但一切我读过,我只是不明白为什么你不会在你的每类实现它.有什么可失去的?它是否有很大的性能影响?

我理解的部分原因IDisposable是它所做的一件事是: Dispose()对象拥有的其他IDisposable.原谅我的无知,但这只适用于给定对象的字段/属性,还是也扩展到在其方法中创建的对象?

例如,如果a Font是在实现的类中的方法内创建的IDisposable,但是Font没有使用using块初始化,或者.Dispose()在方法的末尾显式地创建; 当它的IDisposable父母/班级被GCd /处置时会被处置吗?否则,Font永远不会被处置?

我并不是要离题,但如果确实这样做会像这样"抓住一切"(有效地处理任何IDisposable本来不会留下的错误的儿童对象),那么单凭这个理由不足以证明这一点.总是IDisposable尽可能地实施?

Han*_*ant 9

规则非常简单,如果您的类中有任何一次性类型的字段,则需要实现IDisposable.这样你就可以处理它们了.

方法内部发生的事情与您的类的字段几乎没有关系.如果您创建字体并将其存储在字段中然后是,则上述规则表明您需要Dispose()方法.如果你不这样做,只是使用字体来绘制一些东西,就像你通常那样,那么总是使用using语句,这样你就可以在完成后使用它来立即处理它.

  • +1.请注意,"有任何字段"有些错误"有任何字段和自己的对象"可能会更好.有些情况下,对象有一个包含`IDisposable`的字段,但该对象不具有*IDisposable`.在这种情况下,您不得在对象内部放置`IDisposable`(并且可能不应在该对象上实现`IDisposable`).示例可以是包装类,它将参数打包到方法(即`{destinationName,stream}`作为某些`CopyTo`方法的参数). (3认同)