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,如需转载请自行联系原作者



相关文章
|
9月前
|
存储 Java 容器
JAVACollection接口
JAVACollection接口
49 1
实现多个接口
多个接口间用,号分开即可,如 1 /* 2 Example8_2.cs illustrates implementing multiple interfaces 3  */ 4 5 using System; 6 7 8 // define the IDrivab...
556 0
|
Java
接口2
接口2
88 1
|
程序员
14 接口
14 接口
119 0
由多个接口得到一个接口
接口间可用:实现服用,如public interface IMovable : IDrivable, ISteerable,例如 1 /* 2 Example8_6.cs illustrates deriving an 3 interface from multiple in...
557 0
|
.NET 程序员 C#
[C#1] 11-接口
接口与继承 CLR规定一个类型只能有一个基类型,这种继承成为单继承; 接口继承是指一个类型继承的是接口中的方法签名,而非方法实现,通常称为实现接口; 接口仅仅是含有一组虚方法的抽象类型,不含有任何实现。
796 0
|
Java
【接口的使用】
【接口的使用】
72 0
|
9月前
|
前端开发 API C#
C# 接口
C# 接口
52 1
|
数据库

热门文章

最新文章