假设我有以下内容:
public abstract class ControlLimitBase : IDisposable
{
}
public abstract class UpperAlarmLimit : ControlLimitBase
{
}
public class CdsUpperAlarmLimit : UpperAlarmLimit
{
}两个问题:
,
发布于 2011-09-16 00:44:24
Dispose()永远不会自动调用-它取决于代码的实际使用方式。
1.)当您专门调用Dispose()时,会调用Dispose()
myAlarm.Dispose();2.)使用您的类型的实例在using块的末尾调用Dispose()。
using(var myAlarm = new CdsUpperAlarmLimit())
{
}using块是try/finally块的语法糖,它在finally块中“被使用”的对象上调用Dispose()。
发布于 2011-09-16 00:46:24
IDisposable不会被自动调用。通常使用using语句调用Dispose,如下所示:使用(新限制=ControlLimitBase UpperAlarmLimit()) { //使用限制的代码}
这实际上是一个try/finally块,因此无论您让block.
CdsUpperAlarmLimit间接地实现IDisposable,都会调用Dispose。如果您遵循normal pattern for implementing IDisposable in non-sealed classes,您将重写void Dispose(bool disposing)并在其中处置组合的资源。请注意,垃圾收集器本身并不调用Dispose -尽管它可以调用终结器。您应该很少使用终结器,除非您对非托管资源有直接句柄。
老实说,我通常发现值得尝试改变设计,以避免需要在类中保留非托管资源-坦率地说,在一般情况下正确地实现IDisposable是一件痛苦的事情。如果您的类是密封的(不需要额外的方法;只需实现Dispose()方法),这并不是那么糟糕-但这仍然意味着您的客户端需要知道这一点,以便它们可以使用适当的using语句。
发布于 2011-09-16 00:44:11
我有点困惑,我的IDisposable成员什么时候会被调用。当CdsUpperAlarmLimit的实例超出作用域时,它们会被调用吗?
不是的。它在使用using构造时被调用,如下所示:
using(var inst = new CdsUpperAlarmLimit())
{
//...
}//<-------- here inst.Dispose() gets called.但是如果你这样写它就不会被调用:
{
var inst = new CdsUpperAlarmLimit();
//...
}//<-------- here inst.Dispose() does NOT get called.但是,您也可以这样写:
var inst = new CdsUpperAlarmLimit();
using( inst )
{
//...
}//<-------- here inst.Dispose() gets called.https://stackoverflow.com/questions/7434418
复制相似问题