这个NET IDisposable Pattern implies,如果编写终结器并实现IDisposable,终结器需要显式调用Dispose.

然而,如果我这样做会发生什么:

class Foo : IDisposable
{
     public void Dispose(){ CloseSomeHandle(); }
}

并且不要实现终结器或其他任何东西.框架会为我调用Dispose方法吗?

是的,我意识到这听起来很愚蠢,所有的逻辑都暗示它不会,但我的后脑勺总是有两件事让我不确定.

  1. 几年前,有人告诉我,它实际上会这样做,而那个人在"了解他们的东西"方面有着非常可靠的记录

  2. 编译器/框架根据您实现的接口(例如:foreach、扩展方法、基于属性的序列化等)执行其他"魔术"操作,因此这也可能是"魔术".

虽然我读了很多关于它的东西,有很多隐含的东西,但我从来没有找到这个问题的definitive个肯定或否定的答案.

推荐答案

这个Net垃圾收集器调用该对象.在垃圾收集上完成对象的方法.到了default,这就达到了nothing,如果你想释放额外的资源,就必须避免.

Dispose不会自动调用,如果要释放资源,例如在"using"或"try finally"块中,则必须调用explicity

更多信息请参见http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx

.net相关问答推荐

将Visual Studio更新到v17.9.3后,IDE关闭,dotnet.exe命令报告致命错误.内部CLR错误.(0x80131506)

.NET 7,8 System.Text.Json反序列化多态参数

dotnet 8 web api在部署到docker后无法工作

Azure Function应用程序-如何升级.NET运行时

有没有更好的方法使用 Pusher Channels 的批事件发布消息?

AppShell - 返回导航失败,匹配的路由不明确......但我只注册了一次路由

使用 Powershell TOM 在 SSAS 表格中创建分区

MassTransit RespondAsync 无法返回空值

防止在 .NET 上构建路径中的反斜杠以进行跨平台部署

无法实例化类的代理:System.Net.HttpWebRequest.找不到无参数构造函数

在生产中使用实体框架(代码优先)迁移

通用枚举到int的C#非装箱转换?

无法加载文件或程序集WebGrease,版本=1.5.1.25624,Culture=neutral,PublicKeyToken=31bf3856ad364e35或其依赖项之一

为什么 ?: 会导致转换错误,而 if-else 不会?

如何根据默认样式创建样式?

寻找 .NET 的命令行参数解析器

关闭 Visual Studio 中所有选项卡但当前选项卡的键盘快捷键?

在 .NET 中计算目录大小的最佳方法是什么?

获取系统中已安装的应用程序

名称 <...> 不存在于命名空间 clr-namespace <...>