C#如何能手工释放一个托管对象?

jsayit 2013-09-24 10:59:38
例如
Object obj....
obj=null;
GC.Collect()
这样算是手工释放资源吗?

还是说我在一个类的Dispose函数里面写
member=null;

那么当我显示调用obj.Dispose的时候,GC也会自动执行去回收member?

而且,既然Dispose可以用于释放资源,那么什么情况必须依赖于析构函数(Finalize方法)呢?
谢谢。
...全文
369 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shighui 2013-09-24
  • 打赏
  • 举报
回复
是的,不用管那么多了,有得用就行了。
人生导师 2013-09-24
  • 打赏
  • 举报
回复
首先.NET中的对象内存管理由垃圾回收器来进行回收的,调用GC.Collect()可以强制垃圾回收器来进行垃圾回收,因为垃圾回收器是到到内存规定的限制时才进行垃圾回收的,并不是某个对象不可用了就立即执行垃圾回收的,不过我们可以在代码中强制调用GC.Collect()来进行垃圾回收,不过不建议这样做,因为垃圾回收过程是一个复杂的过程,会影响到程序性能,而显示调用Disopose方法是时用来释放掉托管对象指向的非托管资源,如FileStream fs =new FileStream(filepath)代码,其中fs是一个托管对象,但是它指向的是一个硬盘上的具体文件,调用fs.Dispose()方法是显示用来释放非托管资源的,然后对于析构函数的调用,我们程序员不能控制其什么时候被调用,它的调用使用垃圾回收器来进行管理的,程序这边并不知道,关于垃圾回收器的更多内容可以参考CLR via C#中的垃圾回收器章节
cheng2005 2013-09-24
  • 打赏
  • 举报
回复
托管是什么意思?就是别人来管,你管不到。
phommy 2013-09-24
  • 打赏
  • 举报
回复
前两个例子,如果obj和member没有其他引用的话,会被回收 最后一个问题回答不了
tcmakebest 2013-09-24
  • 打赏
  • 举报
回复
既然可以自动回收,那就好好享受吧,楼主这么多虑不是自寻烦恼吗,入乡随俗吧!
多个C#多线程开发实例 using System; using System.Collections.Generic; using System.Text; namespace Example20 { class Program { class Class1 : IDisposable { //析构函数,编译后变成 protected void Finalize(),GC会在回收对象前会调用调用该方法 ~Class1() { Dispose(false); } //通过实现该接口,客户可以显式地释放对象,而不需要等待GC来释放资源,据说那样会降低效率 void IDisposable.Dispose() { Dispose(true); } //将释放托管资源设计成一个虚函数,提供在继承类中释放基类的资源的能力 protected virtual void ReleaseUnmanageResources() { //Do something... } //私有函数用以释放托管资源 private void Dispose(bool disposing) { ReleaseUnmanageResources(); //为true时表示是客户显式调用了释放函数,需通知GC不要再调用对象的Finalize方法 //为false时肯定是GC调用了对象的Finalize方法,所以没有必要再告诉GC你不要调用我的Finalize方法啦 if (disposing) { GC.SuppressFinalize(this); } } } static void Main(string[] args) { //tmpObj1没有手工释放资源,就等着GC来慢慢的释放它吧 Class1 tmpObj1 = new Class1(); //tmpObj2调用了Dispose方法,传说比等着GC来释放它效率要调一些 //个人认为是因为要逐个对象的查看其元数据,以确认是否实现了Dispose方法吧 //当然最重要的是我们可以自己确定释放的时间以节省内存,优化程序运行效率 Class1 tmpObj2 = new Class1(); ((IDisposable)tmpObj2).Dispose(); } } }

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧