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方法。
















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/577154,如需转载请自行联系原作者



相关文章
|
6月前
|
IDE C# 开发工具
C#系列之接口介绍
C#系列之接口介绍
|
6月前
接口
使用使用接口的时候,需要注意: 1.接口是没有静态代码块或者构造方法的。 2,一个类只能继承一个,但是一个类可以同时实现多个接口。 格式: public class MyInterfaceImpl implements MyInterfaceA,MyInterfaceB {} 3.如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。 4、如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类。 5如果实现类锁实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进 行覆善重写。 6.一个类如果直接父类当中的方法,和接口当中的
38 1
|
6月前
|
前端开发 Java 数据库
你是这么写接口的么
你是这么写接口的么
43 0
|
12月前
|
Java
【实现多个接口的使用】
【实现多个接口的使用】
58 0
|
12月前
|
Java
【接口的使用】
【接口的使用】
57 0
|
前端开发 Java
写一个接口该注意什么?
写一个接口该注意什么?
60 0
接口的使用
接口的使用
83 0
|
程序员
14 接口
14 接口
101 0
|
Java Maven
一文了解ConfigurationConditon 接口
在了解ConfigurationCondition 接口之前,先通过一个示例来了解一下@Conditional 和 Condition。
122 0