博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IDisposeable接口理解
阅读量:6002 次
发布时间:2019-06-20

本文共 1633 字,大约阅读时间需要 5 分钟。

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

你可能感兴趣的文章
配置算法(第4版)的Java编译环境
查看>>
本学习笔记TCP/IP传输协议
查看>>
荣耀10GT升级EMUI 9.0体验分享:这可能是最好用的手机操作系统
查看>>
ZStack基于华芯通打造ARM国产云平台 助力云上贵州多项应用
查看>>
200本“保护日记”记录黄山迎客松生长变化
查看>>
多方力量携手呵护“中华水塔”青海三江源
查看>>
互联网的下一波红利在哪里?
查看>>
拿姐姐身份证登记结婚竟然成了!婚姻户籍信息共享难在哪儿
查看>>
恒大造车加速,联手柯尼塞格打造顶级新能源车
查看>>
JAVA大神说一个例子让你几分钟学会Annotation
查看>>
Python获取当前页面内的所有链接的五种方法
查看>>
【进阶2-3期】JavaScript深入之闭包面试题解
查看>>
【Chrome扩展开发】定制HTTP请求响应头域
查看>>
利用 CocoaPod 和 Git 管理组件中的一些细节梳理
查看>>
聊聊storm trident spout的_maxTransactionActive
查看>>
面向Vue新人:写一个简单的倒计时按钮
查看>>
关于手势处理
查看>>
super
查看>>
5G美洲白皮书:5G开源的现状(pdf)
查看>>
世界移动通信大会
查看>>