110,533
社区成员
发帖
与我相关
我的任务
分享
接下来介绍一些概念。其实这是一个关于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
}
}