托管和非托管的资源
名词解释
- 资源:本地化用法,用来翻译图像和文本;托管和非托管资源,指存储在托管堆和本地堆上的对象。
- 垃圾回收器(GC):.NET GC垃圾回收器
- 文件句柄:何为文件句柄
- 析构函数和终结器:Destructor和Finalizer
后台内存管理
32位处理器,会分配给应用程序4G内存空间,一般从0开始向上排列,存放程序,dll和变量,称为虚拟内存。
- 值类型,一般存在栈中,从高地址向下填充,栈指针总是指向下一个空闲存储单元。由于栈的特性是先进后出,所以变量的生存期是嵌套的,当变量超过作用域后,生存期结束,从栈中删除。
- 引用类型,使用new来分配托管堆上的内存空间,存储实例化的对象内容,同时还需要栈来存储托管堆地址。堆是从低地址向上填充,不存在互相影响关系,能够在方法结束后一段时间内存储的数据仍是可用的。
处理非托管的资源
- 析构函数和终结器
class MyClass
{
~MyClass()
{
// finalizer implementation 相当于重写Finalize()方法
// 第一次删内存,第二次才删对象,所以有性能损失
}
}
- IDisposeable接口
声明了Dispose()方法,能够显示的精确释放资源,但是有可能会出现异常,最好使用try代码块实现。 - using语句
using语句之前一直作为引用命名空间,在此处的作用是限定作用域,在作用域的末尾调用Dispose()方法。
using (var Mycalss=new Mycalss())
{
// do
}
应用
刚好遇到了个实际问题,在项目中需要插入并预览图片,支持更新和删除,然而发现会报错,提示线程正在使用此文件,用了dispose方法也不行。最终的解决办法是将图片用文件流的方式使用,然后dispose才可以。
加载图片后无法删除的解决方法