我们都知道如果是非托管资源是不被gc回收的,那么就需要我们自己重写析构函数,或者着实现IDispose接口,但是我们什么时候需要实现重写析构函数和实现IDispose接口,一般我们使用的非托管资源都已经实现了析构函数或者IDispose接口,比如SQLConnection,Font等,那还有什么需要我们自己来实现呢?我们自己写的类,会是非托管资源么?我们能自定义非托管资源么?
解决方案 »
- 怎样将EXCEL表格数据通过C#.NET导入到SQL数据库中?
- 不太明白InitializeComponent()
- C#怎么识别出图片上的字母和数字,图片背景是白色的,字母和数字也是整齐的排列。相当简单的验证码?
- 求C/S目录树的控件
- C#代码中知道一年中的第几周,那么怎么取得这一周的周一日期和周日的日期?
- 有没使用过WMEncoder SDK 开发过 屏幕录制的吗? 我想问一个问题。
- 如何快速找到控件的属性?
- 请教高手用C#做WEB页,如何做弹出对话框(MessageBox)?
- [醒目]关于程序处于不同操作系统下界面显示问题的疑惑,盼解,欢迎up
- 大家觉得《C# Primer Plus中文版》怎样?
- 如何获取下拉列表中的选项
- c# 怎么添加图片并且显示出来
托管代码的堆上的垃圾内存可由GC自动回收,非托管代码中堆上的垃圾内存必须程序员自己负责释放、回收
在.NET的对象中实际上有两个用于释放资源的函数:Dispose和Finalize。Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。
问一下,在你写过的代码中,会有多少需要实现DIspose的类,或者说在你的工作中,实现Dispose的情况会很多吗?能不能举个例子
public class Document : IDispose
{
public void Dispose()
{
SaveDocument();//避免忘记保存。
}
}
>> gc是会自动回收的,而且数据地址会改变 在c++中new的对象 都需要delete的,而且分配内存空间之后,就不会改变那么就需要我们自己重写析构函数
》》 不需要重写析构函数, 或者finalize,或者着实现IDispose接口,
》》 可以实现dispose 接口,需要释放资源的时候 调接口但是我们什么时候需要实现重写析构函数和实现IDispose接口,一般我们使用的非托管资源都已经实现了析构函数或者IDispose接口,比如SQLConnection,Font
这个是托管资源等,那还有什么需要我们自己来实现呢?使用非托管资源 比如windows api等我们自己写的类,会是非托管资源么?我们能自定义非托管资源么?
unsafe
(
里面非托管的指针啥的,如果要用指针的话 需要用fixed括起来 固定内存地址。
)你还是找本书看看吧
事实上系统也是这个意思。你看看FileStream的Dispose方法。protected override void Dispose(bool disposing)
{
if (this._handle != HostNative.INVALID_HANDLE_VALUE)
{
lock (this)
{
if (this._handle != HostNative.INVALID_HANDLE_VALUE)
{
try
{
this.Flush();
}
finally
{
if (this._ownsHandle)
{
PAL.File_Close(this._handle);
}
this._handle = HostNative.INVALID_HANDLE_VALUE;
this._canRead = false;
this._canWrite = false;
this._canSeek = false;
this._buffer = null;
}
}
}
}
}除了句柄赋值为无效,就只有Flush和Close了。真要问哪些情况使用这个接口,谁的项目都不如.net framework全面啊。你看看谁实现了IDispose不更好么 ^_^