说我有以下内容:
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()对象"正在使用".
不,IDisposable不会自动调用.您通常会Dispose使用using声明来调用,如下所示:
using (ControlLimitBase limit = new UpperAlarmLimit())
{
// Code using the limit
}
Run Code Online (Sandbox Code Playgroud)
这实际上是一个try/finally块,所以Dispose会叫然而你离开块.
CdsUpperAlarmLimit已IDisposable间接实施.如果按照正常模式IDisposable在非密封类中实现,则会覆盖void Dispose(bool disposing)并处理组合资源.
请注意,垃圾收集器不会调用Dispose自身 - 尽管它可以调用终结器.除非您直接处理非托管资源,否则您应该很少使用终结器.
说实话,我通常发现值得尝试改变设计以避免需要在类中保持非托管资源 - IDisposable在一般情况下正确实现坦率地说是一种痛苦.如果您的类是密封的(不需要额外的方法;只需实现该Dispose()方法)也不是那么糟糕- 但它仍然意味着您的客户需要知道它,以便他们可以使用适当的using语句.