IDisposable 接口介绍

本文介绍了一个 C# 示例,展示了如何创建实现 IDisposable 接口的资源类,并正确地释放托管与非托管资源。该资源类通过 Dispose 方法确保了在对象不再使用时能够释放其占用的资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
using  System;
using  System.ComponentModel;

//  The following example demonstrates how to create
//  a resource class that implements the IDisposable interface
//  and the IDisposable.Dispose method.

public   class  DisposeExample
{
    
// A base class that implements IDisposable.
    
// By implementing IDisposable, you are announcing that 
    
// instances of this type allocate scarce resources.
    public class MyResource: IDisposable
    
{
        
// Pointer to an external unmanaged resource.
        private IntPtr handle;
        
// Other managed resource this class uses.
        private Component component = new Component();
        
// Track whether Dispose has been called.
        private bool disposed = false;

        
// The class constructor.
        public MyResource(IntPtr handle)
        
{
            
this.handle = handle;
        }


        
// Implement IDisposable.
        
// Do not make this method virtual.
        
// A derived class should not be able to override this method.
        public void Dispose()
        
{
            Dispose(
true);
            
// This object will be cleaned up by the Dispose method.
            
// Therefore, you should call GC.SupressFinalize to
            
// take this object off the finalization queue 
            
// and prevent finalization code for this object
            
// from executing a second time.
            GC.SuppressFinalize(this);
        }


        
// Dispose(bool disposing) executes in two distinct scenarios.
        
// If disposing equals true, the method has been called directly
        
// or indirectly by a user's code. Managed and unmanaged resources
        
// can be disposed.
        
// If disposing equals false, the method has been called by the 
        
// runtime from inside the finalizer and you should not reference 
        
// other objects. Only unmanaged resources can be disposed.
        private void Dispose(bool disposing)
        
{
            
// Check to see if Dispose has already been called.
            if(!this.disposed)
            
{
                
// If disposing equals true, dispose all managed 
                
// and unmanaged resources.
                if(disposing)
                
{
                
// Dispose managed resources.
                component.Dispose();
                }

             
                
// Call the appropriate methods to clean up 
                
// unmanaged resources here.
                
// If disposing is false, 
                
// only the following code is executed.
                CloseHandle(handle);
                handle 
= IntPtr.Zero;            
            }

            disposed 
= true;         
        }


        
// Use interop to call the method necessary  
        
// to clean up the unmanaged resource.
        [System.Runtime.InteropServices.DllImport("Kernel32")]
        
private extern static Boolean CloseHandle(IntPtr handle);

        
// Use C# destructor syntax for finalization code.
        
// This destructor will run only if the Dispose method 
        
// does not get called.
        
// It gives your base class the opportunity to finalize.
        
// Do not provide destructors in types derived from this class.
        ~MyResource()      
        
{
            
// Do not re-create Dispose clean-up code here.
            
// Calling Dispose(false) is optimal in terms of
            
// readability and maintainability.
            Dispose(false);
        }

    }

    
public static void Main()
    
{
        
// Insert code here to create
        
// and use the MyResource object.   
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值