首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IDisposable问题

IDisposable问题
EN

Stack Overflow用户
提问于 2011-09-16 00:40:36
回答 8查看 505关注 0票数 10

假设我有以下内容:

代码语言:javascript
复制
public abstract class ControlLimitBase : IDisposable 
{
}

public abstract class UpperAlarmLimit : ControlLimitBase 
{
}

public class CdsUpperAlarmLimit : UpperAlarmLimit 
{
}

两个问题:

  1. ,我有点困惑,我的IDisposable成员什么时候会被调用。当CdsUpperAlarmLimit实例超出作用域时,它们会被调用吗?

  1. 如何处理在CdsUpperAlarmLimit类中创建的对象的处置?这也应该从IDisposable派生吗?
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-09-16 00:44:24

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

1.)当您专门调用Dispose()时,会调用Dispose()

代码语言:javascript
复制
myAlarm.Dispose();

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

代码语言:javascript
复制
using(var myAlarm = new CdsUpperAlarmLimit())
{

}

using块是try/finally块的语法糖,它在finally块中“被使用”的对象上调用Dispose()

票数 23
EN

Stack Overflow用户

发布于 2011-09-16 00:46:24

  1. 不,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语句。

票数 5
EN

Stack Overflow用户

发布于 2011-09-16 00:44:11

我有点困惑,我的IDisposable成员什么时候会被调用。当CdsUpperAlarmLimit的实例超出作用域时,它们会被调用吗?

不是的。它在使用using构造时被调用,如下所示:

代码语言:javascript
复制
using(var inst = new CdsUpperAlarmLimit())
{
    //...
}//<-------- here inst.Dispose() gets called.

但是如果你这样写它就不会被调用:

代码语言:javascript
复制
{
   var inst = new CdsUpperAlarmLimit();
   //...
}//<-------- here inst.Dispose() does NOT get called.

但是,您也可以这样写:

代码语言:javascript
复制
var inst = new CdsUpperAlarmLimit();
using( inst )
{
    //...
}//<-------- here inst.Dispose() gets called.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7434418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档