实现IDisposable接口的Dispose()方法using (R r1 = new R ()) {
   r1.F();
}
或者
R r1 = new R();
try {
   r1.F();
}
finally {
   if (r1 != null) ((IDisposable)r1).Dispose();
}参考http://www.microsoft.com/china/msdn/archives/library/dndotnet/html/highperfmanagedapps.asp#highperfmanagedapps_topic8

解决方案 »

  1.   

    这样会带来一些问题。当我在堆栈上的实例超出它的使用范围时会怎样?这个实例将如何被清理掉?许多 C# 开发人员一直在抱怨 C# 语言缺少确定性清理。C# 语言提供 using 关键字来简化 IDisposable 对象的处置,但这需要额外的代码,而且与 C++ 开发人员所熟悉的析构函数的模式相比显得尤为笨拙。在 C# 中,安全的清理工作在默认情况下是无法进行的,它需要进行显式的编码。例如,请考虑图 3 中的第一个 C# 代码片断。StreamReader 对象是在托管堆上声明的。当这个方法执行完毕之后,StreamReader 的实例就没有任何引用存在了。然而,直到垃圾回收器运行时,这个对象才会被清理掉。直到那时,所用的文件才会被关闭,而在此之前,应用程序会一直占用其打开的文件句柄。要添加确定性清除,您必须使用由利用非托管资源的类实现的 IDisposable 接口。图 3 中的第二个代码示例显示了 C# 中的新代码的外观。其实这种方法也未尝不可,而且也还算有一定的可读性。但当您开始加入更多需要清理的对象时,您的代码就会变得越来越难懂。而且,任何您忘记清理的对象都会在最后垃圾回收器实际运行时为 finalizer 线程增加负担。而与此同时,您也许已经锁定了一些有价值的资源。这一点在查看 Visual Basic .NET 中的同等实现时显得尤为不堪,同样如图 3 所示(尽管 Visual Basic 2005 增加了与 C# 相类似的 Using 语句)。现在,Visual C++ 2005 在任何类型上都提供了可以具有析构函数和/或 finalizer 的功能,无论这种类型是托管的还是本机的。在它为托管类型的情况下,编译器会将析构函数映射到 IDisposable::Dispose 方法。这意味着您能够用 C++ 语言编写同样的方法,如图 3 中的第四个代码片断所示,其中,阅读器的析构函数/Dispose 方法将会自动被调用,就像您在 C# 中使用“Using”语句一样。当在堆栈上创建某一类型时,它的析构函数会在它超出其使用范围时被调用。
      

  2.   

    参考一下微软的网络书店里的例子,让你的类继承自接口IDisposable
    然后实现Dispose()
    他的代码如下;
    /// <summary>
            ///     Dispose of this object's resources.
            /// </summary>
            public void Dispose()
            {
                Dispose(true);
    GC.SuppressFinalize(true); // as a service to those who might inherit from us
            } /// <summary>
            /// Free the instance variables of this object.
            /// </summary>
            protected virtual void Dispose(bool disposing)
            {
    if (! disposing)
    return; // we're being collected, so let the GC take care of this object            if (dsCommand != null )
                {
                    if (dsCommand.SelectCommand != null)
                    {
                        if( dsCommand.SelectCommand.Connection != null)
                            dsCommand.SelectCommand.Connection.Dispose();
                        dsCommand.SelectCommand.Dispose();
                    }
                    dsCommand.Dispose();
                    dsCommand = null;
                }
            }
      

  3.   

    谢谢楼上几位的帮助我的代码类似下面
    Image img=Image.From("c:\abc.gif")
    img.Flip(...);//do some operations here
    img.close();
    img.dispose();
    File.Delete("c:\abc.gif");;//error here!请各位再帮帮忙