c# - GC 和 IDispose 在 C# 中如何工作?

标签 c# .net idisposable

我记得我是通过将图像从网络直接流式传输到位图中来加载图像的。关闭流,返回位图并将其保存在图像控件中。

我异常(exception),当我执行 = loadPicture() 时,第一个位图将被释放,就像智能​​指针在 C++ 中所做的那样。但它没有,在我调用 dispose 之前我消耗了很多 ram。所以我的问题是。

GC 和 Dispose able 对象在 C# 中如何工作?为什么它不像 smart_ptr 那样实现?

最佳答案

引用不是智能指针。让引用变量超出范围,将其替换为另一个值,和/或将其设置为 null 都完全没有

这只是 CLI/GC 设计的一部分...

垃圾回收 (GC) 将在需要时 运行,并且应该清理使用的托管内存,以​​及(如果提供终结器)任何非托管资源。但是对于确定性清理:这就是 IDisposable 的全部目的。当你完成这些对象时,你的工作是 Dispose() - 通过 using,或者将它交给承担这个责任的其他东西(常见的,对于例如,流/读者等)。

using (StreamReader reader = new StreamReader(myfile)))
{
   ...
}

关于c# - GC 和 IDispose 在 C# 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/780834/

相关文章:

c# - readData 用于 24 位 FLAC 和 WAV 文件

c# - Entity Framework 的奇怪行为

c# - 从具有一次性成员的一次性类派生的类

c# - 交易范围类似的功能

c# - 如何在安装项目中更改 Windows 应用程序的默认图标

c# - 错误 CS1061 'IdentityBuilder' 不包含 'AddEntityFrameworkStores' 的定义

c# - 使用 System.IO.Compression 创建后无效的 zip 文件

.net - 如何将超过 2Gb 的文件上传到 IIS 7.5/.Net 4?

.net - 实现 LINQ to Entities 不受支持的方法

c# - Idisposable 是否会在 struct 等堆栈项上调用(不使用 "Using"时)