IDisposable 接口
定义一种释放分配的资源的方法。
命名空间: System
程序集: mscorlib(在 mscorlib.dll 中)
IDisposable 类型公开以下成员。
此接口的主要用途是释放非托管资源。 当不再使用托管对象时,垃圾回收器会自动释放分配给该对象的内存。 但无法预测进行垃圾回收的时间。 另外,垃圾回收器对窗口句柄或打开的文件和流等非托管资源一无所知。
将此接口的 Dispose 方法与垃圾回收器一起使用来显式释放非托管资源。 当不再需要对象时,对象的使用者可以调用此方法。
向现有类添加 IDisposable 接口是重大的更改,因为这更改了类的语义。
![]() |
---|
C++ 程序员应当阅读 析构函数和终结器在 Visual C++。 在 .NET Framework 版本中,C++ 编译器为实现资源的确定释放提供支持,同时不允许 Dispose 方法的直接实现。 |
有关如何使用此接口和 Object::Finalize 方法的详细讨论,请参见垃圾回收和实现 Dispose 方法主题。
调用 IDisposable 接口
在调用可实现 IDisposable 接口的类时,请使用 try/finally 模式来确保非托管资源能够释放出来,即使应用程序因出现异常而中断也是如此。
有关 try/finally 模式的更多信息,请参见 Try...Catch...Finally 语句 (Visual Basic)、try-finally(C# 参考)或 try-finally 语句 (C)。
请注意,您可以使用 using 语句(在 Visual Basic 中为 Using)来代替 try/finally 模式。 有关更多信息,请参见 Using 语句 (Visual Basic) 文档或 using 语句(C# 参考) 文档。
下面的示例演示如何创建用来实现 IDisposable 接口的资源类。
#using <System.dll> #using <System.Windows.Forms.dll> using namespace System; using namespace System::ComponentModel; using namespace System::Windows::Forms; // The following example demonstrates how to create a class that // implements the IDisposable interface and the IDisposable.Dispose // method with finalization to clean up unmanaged resources. // public ref class MyResource: public IDisposable { private: // Pointer to an external unmanaged resource. IntPtr handle; // A managed resource this class uses. Component^ component; // Track whether Dispose has been called. bool disposed; public: // The class constructor. MyResource( IntPtr handle, Component^ component ) { this->handle = handle; this->component = component; disposed = false; } // This method is called if the user explicitly disposes of the // object (by calling the Dispose method in other managed languages, // or the destructor in C++). The compiler emits as a call to // GC::SuppressFinalize( this ) for you, so there is no need to // call it here. ~MyResource() { // Dispose of managed resources. component->~Component(); // Call C++ finalizer to clean up unmanaged resources. this->!MyResource(); // Mark the class as disposed. This flag allows you to throw an // exception if a disposed object is accessed. disposed = true; } // Use interop to call the method necessary to clean up the // unmanaged resource. // [System::Runtime::InteropServices::DllImport("Kernel32")] static Boolean CloseHandle( IntPtr handle ); // The C++ finalizer destructor ensures that unmanaged resources get // released if the user releases the object without explicitly // disposing of it. // !MyResource() { // Call the appropriate methods to clean up unmanaged // resources here. If disposing is false when Dispose(bool, // disposing) is called, only the following code is executed. CloseHandle( handle ); handle = IntPtr::Zero; } }; void main() { // Insert code here to create and use the MyResource object. MyResource^ mr = gcnew MyResource((IntPtr) 42, (Component^) gcnew Button()); mr->~MyResource(); }