问下dispose,,,,在线等!!!!!!,着急啊

zhuzhusex7999 2012-08-09 11:59:33
问题1:
托管资源与非托管资源的区别,是不是托管资源自动由CLR释放占用资源
问题2:
.NET中的类,是不是有的是托管类,有的是非托管类, 如File对象,Stream对象
问题3:
托管类是不是都实现了Dispose,非托管类都没实现Dispose
问题4:
如果我不显示调用Dispose,是不是CLR也会回收资源?
...全文
142 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
pavee 2012-08-09
  • 打赏
  • 举报
回复
再补充一些,下面是我回答另外一位朋友的回复,有具体的继承IDisposable Interface例子


接下来介绍一些概念。其实这是一个关于Managed code 和 Unmanaged code的问题。Managed code能为.NET Framework所识别,当Object不再被使用时,CLR的Garbage Collection会自动调用Finalize Destructor释放系统内存。然而一个应用程序会经常使用Unmanaged code,比分说Database connection。这些对象不会被Garbage Collection自动清除,这就需要手动去完成。当有大量Unmanaged code时,清除这些资源很麻烦的,也容易出错。.NET Framework提供了一个接口:IDisposable。里面定义了唯一的一个方法:Dispose。并且C#提供了using statement,这个statement可以保证Dispose方法能自动调用。

下面的代码是经过测试的,你可以在MyAction(这个方法满足Action delegate的定义)方法里设个断点,就会发现代码的执行会走到哪儿的。


public class DisposableAction : IDisposable
{
System.Action _action;

public DisposableAction(System.Action action)
{
if (action == null)
throw new ArgumentNullException("action");

_action = action;
}

public void Dispose()
{
_action();
}
}

class Program
{
static void Main()
{
using (DisposableAction da = new DisposableAction(MyAction))
{
// Doing something
}
}

public static void MyAction()
{
// Release Unmanaged code, such as close database connection
}
}
pavee 2012-08-09
  • 打赏
  • 举报
回复
1楼提供了很好的资源。

托管资源一般不要去管它,只要是.Net Framework的资源,都是托管的。

非托管资源就要手动调用Dispose方法去释放资源,但你要知道Dispose方法是从哪儿来的。Dispose方法是定义在IDisposable Interface中。所以,当你定义非托管资源时,要继承IDisposable Interface。
牛哥_ 2012-08-09
  • 打赏
  • 举报
回复
可以满足你的要求了
zhuzhusex7999 2012-08-09
  • 打赏
  • 举报
回复
拜托大家按照我提的问题 说的详细一点吧!!!!!!!!!!! 我是看完资料之后才有以上问题的,,,把资料再让我看 ,,,,不是又回去了!!!!!!!!!!!

110,533

社区成员

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

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

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