C#继承IDisposable释放资源
public class CDisposable : IDisposable
{
//析构函数,编译后变成 protected void Finalize(),GC会在回收对象前会调用调用该方法
~CDisposable()
{
Dispose(false);
} //通过实现该接口,客户可以显式地释放对象,而不需要等待GC来释放资源,据说那样会降低效率
void IDisposable.Dispose()
{
Dispose(true);
} //将释放非托管资源设计成一个虚函数,提供在继承类中释放基类的资源的能力
protected virtual void ReleaseUnmanageResources()
{
//Do something...
Console.WriteLine("Do something... ");
} //私有函数用以释放非托管资源
private void Dispose(bool disposing)
{
ReleaseUnmanageResources(); //为true时表示是客户显式调用了释放函数,需通知GC不要再调用对象的Finalize方法
//为false时肯定是GC调用了对象的Finalize方法,所以没有必要再告诉GC你不要调用我的Finalize方法啦
if (disposing)
{
GC.SuppressFinalize(this);
}
}
public static void ShowResults()
{
//Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
int sms = Environment.TickCount;
Console.WriteLine(sms.ToString());
int i = ;
while (i < )
{
//tmpObj1没有手工释放资源,就等着GC来慢慢的释放它吧
CDisposable tmpObj1 = new CDisposable();
i++;
}
int mms = Environment.TickCount;
Console.WriteLine(mms - sms);
//Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
i = ;
while (i < )
{
Console.Write(" ");
//tmpObj2调用了Dispose方法,传说比等着GC来释放它效率要调一些
//个人认为是因为要逐个对象的查看其元数据,以确认是否实现了Dispose方法吧
//当然最重要的是我们可以自己确定释放的时间以节省内存,优化程序运行效率
CDisposable tmpObj2 = new CDisposable();
((IDisposable)tmpObj2).Dispose();
i++;
}
int ems = Environment.TickCount;
Console.WriteLine(ems - mms);
//Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
C#继承IDisposable释放资源的更多相关文章
- 编写高质量代码改善C#程序的157个建议——建议46:显式释放资源需继承接口IDisposable
建议46:显式释放资源需继承接口IDisposable C#中的每一个类型都代表一种资源,资源分为两类: 托管资源:由CLR管理分配和释放的资源,即从CLR里new出来的对象. 非托管资源:不受CLR ...
- C# ~ 由 IDisposable 到 GC
IDisposable 接口 1. 托管资源和非托管资源 · 托管资源 a. CLR 控制和管理的内存资源,如程序中在 Heap 上分配的对象.作用域内的变量等: b. GC 机制实现自 ...
- 接口IDisposable的用法
C#的每一个类型都代表一种资源,而资源又分为两类: 托管资源 由CLR管理分配和释放的资源,即从CLR里new出来的对象. 非托管资源 不受CLR管理的对象,如Windows内核对象,或者文件.数 ...
- .NET 垃圾回收与内存泄漏
> 前言相信大家一定听过,看过甚至遇到过内存泄漏.在 .NET 平台也一定知道有垃圾回收器,它可以让开发人员不必担心内存的释放问题,因为它会自定管理内存.但是在 .NET 平台下进行编程,绝对不 ...
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...
- [.net 面向对象程序设计进阶] (8) 托管与非托管
本节导读:虽然在.NET编程过程中,绝大多数内存垃圾回收由CLR(公共语言运行时)自动回收,但也有很多需要我们编码回收.掌握托管与非托管的基本知识,可以有效避免某些情况下导致的程序异常. 1.什么是托 ...
- using语法糖
资源的分类 首先说一下资源的分类: 托管资源:由CLR管理分配和释放资源 非托管资源:不受CLR管理的对象,如 文件(StreamReader,BinaryReader,DataTable,各种Str ...
- C#的GC机制(来自网摘复制,未整理)
第一个就是很多人用.Net写程序,会谈到托管这个概念.那么.Net所指的资源托管到底是什么意思,是相对于所有资源,还是只限于某一方面资源?很多人对此不是很了解,其实.Net所指的托管只是针对内存这一个 ...
- C# 托管资源和非托管资源
托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回 ...
随机推荐
- 《Linux总线、设备与驱动》USB设备发现机制
说明:本分析基于mstar801平台Linux2.6.35.11内核,其他内核版本仅供参考. 一.程序在内核中的位置 1.usb host做为pci总线下的一个设备存在(嵌入式系统中有可能也会直接挂在 ...
- 顺序查找 && 折半查找
顺序查找 算法描述 顺序比较即可. 平均查找长度 (n+1)/2, 其中n为表长 ...
- nginx rewrite only specific servername to https
需求: 把某个域名的80端口服务 ----> 重定向转到 这个域名的 443端口的服务. server { listen 80; server_name xxx.abcd.com.cn; ...
- [Functional Programming] Build a Linear congruential generator
What we are going to do in this post, is to build a random number generator. As you might know that ...
- 揭开Faiss的面纱 探究Facebook相似性搜索工具的原理
https://www.leiphone.com/news/201703/84gDbSOgJcxiC3DW.html 本月初雷锋网报道,Facebook 开源了 AI 相似性搜索工具 Faiss.而在 ...
- 输入框提示文字跨浏览器的placeholder-jQuery版
<script type="text/javascript" src="jquery-1.7.2.min.js"></script> & ...
- JavaScript原始基础
一.算法 + 数据结构 = 程序 程序=数据结构+算法是由N.Wirth(沃斯)提出来的. 程序是计算机指令的某种组合,控制计算机的工作流程,完成一定的逻辑功能,以实现某种任务: 数据结构指的是数据与 ...
- vb.net 模拟UDP通信
Imports System.Net Imports System.Text.Encoding Public Class Form1 Dim publisher As New Sockets.UdpC ...
- PHP高级教程-异常处理(Exception)
PHP 异常处理 异常用于在指定的错误发生时改变脚本的正常流程. 异常是什么 PHP 5 提供了一种新的面向对象的错误处理方法. 异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程.这种情况 ...
- PHP高级教程-Data
PHP date() 函数 PHP date() 函数用于格式化时间/日期. PHP date() 函数 PHP date() 函数可把时间戳格式化为可读性更好的日期和时间. 时间戳是一个字符序列,表 ...