关于C#中类的释放问题 class dispose...求专业回答...
貌似释放就是下面这段代码。。。有些不了解。。。请指教。。。publicclassMyResource:IDisposable{privateIntPtrhandle;pr...
貌似释放就是下面这段代码。。。有些不了解。。。请指教。。。
publicclass MyResource: IDisposable
{
private IntPtr handle;
private Component component = new Component();//这个很关键
privatebool disposed = false;
public MyResource(IntPtr handle)
{
this.handle = handle;
}
publicvoid Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
privatevoid Dispose(bool disposing)
{
if(!this.disposed)
{
if(disposing)
{
component.Dispose();//就在这了,为什么释放只要用这句就能达到效果呢?这样真的就能达到释放的效果吗????
}
CloseHandle(handle);//这个应该不是必须要的吧?
handle = IntPtr.Zero;//这个可以没有吧???
}
disposed = true;
}
[System.Runtime.InteropServices.DllImport("Kernel32")]
privateexternstatic Boolean CloseHandle(IntPtr handle);
~MyResource()
{
Dispose(false);
}
}
归根结底就是compent.dispose释放资源是怎么做到的,释放了些什么资源?如果我在类里面定义了bitmap什么的。。也跟着释放???感觉不会吧。。。
看这样子是不会有什么专业人士来回答了。。。大致总结下吧。。。
private bool disposed = false; private Bitmap bit=new Bitmap(1920,1080);
publicvoid Dispose()
{
Dispose(true);GC.SuppressFinalize(this);
}
privatevoid Dispose(bool disposing)
{ if(!this.disposed)
{
if(disposing) { bit.Dispose();bit=null; }
}
disposed = true;
}
~MyResource()
{
Dispose(false);
}
我觉得吧应该资源要自己释放,component.Dispose()按上面写法完全无效,测试过内存释放不了的,我是用50张位图测试的,内存用component.Dispose()无效,所以自己直接bit.dispose()就好。还有CloseHandle(IntPtr handle),这个个人认为普通类也没用,压根就没有句柄什么释放,这个像是释放句柄什么的,所以归根结底我决的语句可以简化成以上代码。那以上我是这么想的,不知还有没有什么高人解释下。没的话,过两天就结贴了。 展开
publicclass MyResource: IDisposable
{
private IntPtr handle;
private Component component = new Component();//这个很关键
privatebool disposed = false;
public MyResource(IntPtr handle)
{
this.handle = handle;
}
publicvoid Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
privatevoid Dispose(bool disposing)
{
if(!this.disposed)
{
if(disposing)
{
component.Dispose();//就在这了,为什么释放只要用这句就能达到效果呢?这样真的就能达到释放的效果吗????
}
CloseHandle(handle);//这个应该不是必须要的吧?
handle = IntPtr.Zero;//这个可以没有吧???
}
disposed = true;
}
[System.Runtime.InteropServices.DllImport("Kernel32")]
privateexternstatic Boolean CloseHandle(IntPtr handle);
~MyResource()
{
Dispose(false);
}
}
归根结底就是compent.dispose释放资源是怎么做到的,释放了些什么资源?如果我在类里面定义了bitmap什么的。。也跟着释放???感觉不会吧。。。
看这样子是不会有什么专业人士来回答了。。。大致总结下吧。。。
private bool disposed = false; private Bitmap bit=new Bitmap(1920,1080);
publicvoid Dispose()
{
Dispose(true);GC.SuppressFinalize(this);
}
privatevoid Dispose(bool disposing)
{ if(!this.disposed)
{
if(disposing) { bit.Dispose();bit=null; }
}
disposed = true;
}
~MyResource()
{
Dispose(false);
}
我觉得吧应该资源要自己释放,component.Dispose()按上面写法完全无效,测试过内存释放不了的,我是用50张位图测试的,内存用component.Dispose()无效,所以自己直接bit.dispose()就好。还有CloseHandle(IntPtr handle),这个个人认为普通类也没用,压根就没有句柄什么释放,这个像是释放句柄什么的,所以归根结底我决的语句可以简化成以上代码。那以上我是这么想的,不知还有没有什么高人解释下。没的话,过两天就结贴了。 展开
5个回答
展开全部
C#托管资源释放就是component.Dispose(),具体人家做了什么,这个你可以去问微软,或者去问更懂得人,C#都是托管程序,很多东西都是封装的,你只能看到接口。。。CloseHandle(handle)使用来释放非托管资源的,非托管资源不归虚拟机保管,由系统保管,自然要CloseHandle(handle) (这是释放系统对象的API函数,这个函数属于windows系统的,不是.NET的)。。。。
更多追问追答
追问
handle是窗口句柄吧。。。。那我普通的一个类不存在窗口啊。。。那句柄什么的不需要吧。。。关键是component.Dispose()。。。。这个我真心无法理解。。。因为文中就两句private Component component = new Component();和component.Dispose()。。。这自己new一下释放一下,他真就有那么智能把其他资源都释放了?????????这。。。表示不敢相信啊。。。。
追答
handle是句柄并不代表是窗口句柄,windows对象几十种,一个流,一个位图都有它的句柄,其他程序中的对象,又外部程序使用都会分配句柄或者ID之类的东西,因为这些东西不是你的,就像银行里的钱,貌似是你的,东西是你申请的,但这只是逻辑上是你的,实际上不在你口袋里,你摸不到他,那你只能按银行的规矩办,要有银行卡号。。。。
为啥释放那么简单??原因就是这些东西都不是你在管,而是有人在管,你只需要告诉他做什么就行了,你想创建或用某样东西,你就要告诉管理员替你做,他会分配给你个句柄,在逻辑上这个东西就是你的,你可以通过接口函数来使用它(只是具体操作不归你),释放亦一样,只需要通知一声。。。C#托管资源可以不必释放,他能自动释放,当所有引用变量出了作用域,该对象就表示没人引用,C#就自动释放(这时外界也没法用,因为连第一个指示该对象的句柄(或指针)都丢失了,这就无法查询,如果是windows,他就没有这种功能,当丢失了所有指针,或句柄,就成没有任何线索来操作了,包括closehandle()和delete也无法操作,只能等到申请他的进程或关闭。。。
人家微软说可以那就是可以,你一位人家微软费老鼻子劲编写个开发软件是来骗你的。。。。
展开全部
非托管的释放不了,例如pen,文件句柄,之类的,具体自己百度,其他的微软有自动回收机制,如果每个东西都要程序员来控制,那你就忙死了,如果不回收内存就泄漏,你的软件就垮了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C#是自带GC垃圾回收机制的。
追问
GC释放托管资源对吧,那非托管资源呢?析构函数搞定?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一般不需要管这些东西吧。我从来不释放也没问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果一个女人问你,你有没有恋爱过,你会什么回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询