可不可以显示的释放Winform的资源,对Winform中的Dispose方法进行覆盖,比如这种方法:
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null) 
{
components.Dispose();
}
}
base.Dispose( disposing );
}请问这种方法是手动释放还是GC自动释放。怎样写改为,用户手动释放,应该怎样写

解决方案 »

  1.   

    http://www.builder.com.cn/2008/0720/997348.shtml   看看这个文章对你应该有帮助
      

  2.   

    form1.Close();
    ((IDisposable)form1).Dispose();都是手动释放当然无论手动自动,都会调用到你说的这个函数
      

  3.   

    把方法体单独写一个类,然后using语句块释放掉
      

  4.   



    那看你把代码写在什么地方了,有的写在异常里,try{}catch{} 有的代码执行完释放关闭!  先打开Open();写你执行的代码、写完了,释放资源、关闭! 也就是关门放狗
      

  5.   

    在.NET平台中内存管理由GC全负责,无需也不需开发者操心,而对于非托管资源GC就无能为力,这通常有两种参考的方案:Finalize和IDisposable模式,Finalze最大的问题就是执行的不确定性和对性能的阻塞,所以我们更推荐以IDisposable配合Finalized的方式来实现对非托管资源的管理工作。在.NET中,简单的说IDisposable模式就是在自定义类中实现IDisposable接口,在其中定义的Dispose方法中释放非托管资源。那么对于您的问题就有了对应的思路:Q1:是不是只有存在非托管资源的情况下才有必要实现Dispose接口?
    Q2:在实现Dispose接口的时候,释放非托管资源的代码段应该写什么?
    Q3:托管资源本来就由GC来处理,我想在实现Dispose接口的时候,无需手动写释放托管资源的代码吧?A1:这是显然的,在.NET框架类库中实现IDisposable接口的基本是持有非托管资源的类型,例如IDbConnection、Font、Brush、Steam、TextReader等等,从名字就可以看出端倪;
    A2:应该怎么写,取决于你释放的非托管资源是什么,一般来说就是调用Win API完成资源清理,例如对于数据库资源资源你通常:
      if (disposing)
      {
      if (connection != null)
      connection.Dispose();
      }
    而对于文件资源,你可能
      if (fileHandle != IntPtr.Zero)
      {
      CloseHandle(fileHandle);
      fileHandle = IntPtr.Zero;
      }
    A3:记住,永远避免自行处理托管资源。