IDisposable问题

Hos*_*146 10 c#

说我有以下内容:

public abstract class ControlLimitBase : IDisposable 
{
}

public abstract class UpperAlarmLimit : ControlLimitBase 
{
}

public class CdsUpperAlarmLimit : UpperAlarmLimit 
{
}
Run Code Online (Sandbox Code Playgroud)

两个问题:

我的IDisposable成员实际上会被叫到,我有点困惑.当CdsUpperAlarmLimit的实例超出范围时,它们会被调用吗?

2.如何处理在CdsUpperAlarmLimit类中创建的对象?这也应该来自IDisposable吗?

Bro*_*ass 23

Dispose() 永远不会自动调用 - 它取决于代码的实际使用方式.

1.)Dispose()当你特别打电话时调用Dispose():

myAlarm.Dispose();
Run Code Online (Sandbox Code Playgroud)

2.)使用您的类型的实例在块Dispose()的末尾调用using.

using(var myAlarm = new CdsUpperAlarmLimit())
{

}
Run Code Online (Sandbox Code Playgroud)

该using块是块的语法糖,在finally块中try/finally调用Dispose()对象"正在使用".


Jon*_*eet 5

  1. 不,IDisposable不会自动调用.您通常会Dispose使用using声明来调用,如下所示:

    using (ControlLimitBase limit = new UpperAlarmLimit())
    {
        // Code using the limit
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这实际上是一个try/finally块,所以Dispose会叫然而你离开块.

  2. CdsUpperAlarmLimit已IDisposable间接实施.如果按照正常模式IDisposable在非密封类中实现,则会覆盖void Dispose(bool disposing)并处理组合资源.

请注意,垃圾收集器不会调用Dispose自身 - 尽管它可以调用终结器.除非您直接处理非托管资源,否则您应该很少使用终结器.

说实话,我通常发现值得尝试改变设计以避免需要在类中保持非托管资源 - IDisposable在一般情况下正确实现坦率地说是一种痛苦.如果您的类是密封的(不需要额外的方法;只需实现该Dispose()方法)也不是那么糟糕- 但它仍然意味着您的客户需要知道它,以便他们可以使用适当的using语句.