IDisposeable接口理解

实现IDisposeable接口,必须实现Dispose方法。因此可以使用次方法来代替析构函数,因为析构函数的执行会有效率问题。

实现此方法,配合析构函数,可以很好的释放资源,即使程序员忘了Dispose,也可以由析构函数释放资源。看如下代码: 

 
 
public class SampleClass : IDisposable
{
// 演示创建一个非托管资源
private IntPtr nativeResource = Marshal.AllocHGlobal( 100 );
// 演示创建一个托管资源
private AnotherResource managedResource = new AnotherResource();
private bool disposed = false ;

/// <summary>
/// 实现IDisposable中的Dispose方法
/// </summary>
public void Dispose()
{
// 必须为true
Dispose( true );
// 通知垃圾回收机制不再调用终结器(析构器)
GC.SuppressFinalize( this );
}

/// <summary>
/// 不是必要的,提供一个Close方法仅仅是为了更符合其他语言(如C++)的规范
/// </summary>
public void Close()
{
Dispose();
}

/// <summary>
/// 必须,以备程序员忘记了显式调用Dispose方法
/// </summary>
~ SampleClass()
{
// 必须为false
Dispose( false );
}

/// <summary>
/// 非密封类修饰用protected virtual
/// 密封类修饰用private
/// </summary>
/// <param name="disposing"></param>
protected virtual void Dispose( bool disposing)
{
if (disposed)
{
return ;
}
if (disposing)
{
// 清理托管资源
if (managedResource != null )
{
managedResource.Dispose();
managedResource
= null ;
}
}
// 清理非托管资源
if (nativeResource != IntPtr.Zero)
{
Marshal.FreeHGlobal(nativeResource);
nativeResource
= IntPtr.Zero;
}
// 让类型知道自己已经被释放
disposed = true ;
}

public void SamplePublicMethod()
{
if (disposed)
{
throw new ObjectDisposedException( " SampleClass " , " SampleClass is disposed " );
}
// 省略
}
}

在Dispose模式中,几乎每一行都有特殊的含义。

  //通知垃圾回收机制不再调用终结器(析构器)
  GC.SuppressFinalize(this);
此句可以屏蔽掉析构函数,这样就不需要在去释放已经被释放的资源了。如果dispose方法没调用,析构函数才被运行,更加万无一失了。

实现了IDisposeable接口的对象,可以使用using语句来实现语法糖的效果。using包括的对象,会在结束语句的时候,自动调用dispose方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值