c# - 在哪里清理处置模式中的非托管资源?
问题描述
我对这种模式感到困惑。
如果 disposing 为真(从 Dispose() 调用),我们将在那里释放托管对象。如果 disposing 为 false(从 Finalizer() 调用),则访问引用的对象是不安全的,这些引用的对象是像文件流这样的非托管对象。
如果 disposing 为真,那么我们将无法释放非托管对象?如果 disposing 是 false,我们将无法释放托管对象?
搜索这个模式,在 Dispose(boolean) 方法中有不同的实现。MSDN 实现
这是我从示例和教程中得到的。
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Free any other managed objects here.
}
else
{
//not safe to access referenced object
}
// Free any unmanaged objects here.
}
disposed = true;
}
解决方案
在正确形成的IDisposable
模式中,true
值disposing
意味着我们从显式Dispose
调用或离开using
范围(这是更可取的IDisposable
消费方式)到达方法。然而,并非所有消费者都被正确实现,为了确保我们能够在我们从终结器IDisposable
调用的实现中回收所有非托管资源。Dispose(false)
因此false
,在Dispose
指示我们在终结阶段到达此调用并且在此阶段某些引用可能不可用,这就是我们使用此标志的原因 - 以区分我们在正常流程执行下可以做什么和在终结阶段条件下我们可以做什么。无论此标志如何,我们都会释放非托管资源。
推荐阅读
- python - 如何裁剪轮廓的内部?
- python - 使用 Windows CMD 从下载的文件夹安装依赖项
- javascript - 如何在 reactstrap 中垂直而不是水平设置卡片样式
- google-contacts-api - 创建谷歌联系人而不复制他们
- laravel - 无法在 Plesk 服务器中使用 laravel smtp 发送邮件
- angular - 数字输入总是触发更改事件
- redis - Redis 从站没有响应数据
- c# - 如何优化代码以编写超过 140 万行的数据
- flutter - Flutter如何检测PageView onTapUp
- c# - 如何使用 C# 中的 HttpWebRequest 类将标头和正文中的值传递给 API 的 GET 响应?