C#处理非托管资源
using System; //处理非托管资源
//例如:文件句柄、网络连接、数据库连接 //实现IDisposable不意味着也应该实现一个终结器,终结器会带来额外开销
//发布本机资源,要释放本机资源就需要终结器 //如果实现了终结器,也应该实现IDisposabel接口
//这样本机资源可以早些释放 namespace ConsoleApp
{
//1.析构函数或终结器
class MyClass
{
//C#无法确定对象的析构函数何时执行
//会有延迟
//频繁使用析构函数,而且使用它们执行长时间的清理任务,对性能影响就会非常显著
~MyClass()
{
//其实是Finalize()方法
}
} //2.实现System.IDisposable
class MyClass1 : IDisposable
{
public void Dispose()
{
}
} //3.双重实现
class MyClass2 : IDisposable
{
//表示对象是否已被清理
private bool _isDisposed = false;
public void Dispose()
{
//...
Dispose(true);
GC.SuppressFinalize(this);//告诉回收器不需要调用析构函数了 } protected virtual void Dispose(bool disposing)
{
if (!_isDisposed)
{
if (disposing)
{//...
//清理托管资源
}
//...
//清理非托管
}
_isDisposed = true;
} ~MyClass2()//只清理非托管
{
Dispose(false);
}
} class Program
{
static void Main(string[] args)
{
MyClass1 theInstance = null;
//使用try/finally确保发生异常也能释放资源
try
{
theInstance = new MyClass1();
}
finally
{
theInstance?.Dispose();
} //如果这些大括号过多很容易混淆
//也可以使用using来完成此工作,在变量超出作用域会自动调用Dispose()
using (var ins = new MyClass1())
{
//...
} }
}
}
C#处理非托管资源的更多相关文章
- .NET 清理非托管资源
Dispose 类型的 Dispose 方法应释放它拥有的所有资源.它还应该通过调用其父类型的 Dispose 方法释放其基类型拥有的所有资源.该父类型的 Dispose 方法应该释放它拥有的所有资源 ...
- .NET垃圾回收:非托管资源,IDispose和析构函数的结合
http://blog.jobbole.com/85436/ 原文出处: 田小计划 欢迎分享原创到伯乐头条 前面一篇文章介绍了垃圾回收的基本工作原理,垃圾回收器并不是可以管理内存中的所有资源.对于 ...
- C# 托管资源与非托管资源
在.net 编程环境中,系统的资源分为托管资源和非托管资源. 托管资源: Net平台中,CLR为程序员提供了一种很好的内存管理机制,使得程序员在编写代码时不要显式的去释放自己使用的内存资源(这些在先前 ...
- C# using 三种使用方式 C#中托管与非托管 C#托管资源和非托管资源区别
1.using指令.using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到. ...
- C# 托管资源和非托管资源
托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回 ...
- .NET垃圾回收 – 非托管资源
前面一篇文章介绍了垃圾回收的基本工作原理,垃圾回收器并不是可以管理内存中的所有资源.对于所有的托管资源都将有.NET垃圾回收机制来释放,但是,对于一些非托管资源,我们就需要自己编写代码来清理这类资源了 ...
- C# 释放非托管资源
C#中资源分为托管资源和非托管资源. 托管资源由垃圾回收器控制如何释放,不需要程序员过多的考虑(当然也程序员也可以自己释放). 非托管资源需要自己编写代码来释放.那么编写好的释放非托管资源的代码(释非 ...
- 利用IDisposable接口构建包含非托管资源对象
托管资源与非托管资源 在.net中,对象使用的资源分为两种:托管资源与非托管资源.托管资源由CLR进行管理,不需要开发人员去人工进行控制,.NET中托管资源主要指"对象在堆中的内存" ...
- .net 资源释放(托管资源和非托管资源)
1.托管资源 像int.float.DateTime等都是托管资源:net中80%的资源都是托管资源: 托管资源的回收通过GC(垃圾回收器)自动释放分配给该对象的内存,但无法预测进行垃圾回收的时间,我 ...
随机推荐
- 【转】VUE 爬坑之旅-- 如何对公共JS,CSS进行统一管理,全局调用
原文:https://blog.csdn.net/zgh0711/article/details/78664262 vue 中,将页面分为了各个组件,我们写好组件,就可以将这个组件运用到其他各个页面中 ...
- npm:Fatal error in , line 0 #unreachable code 解决
是nodejs环境本身的问题,下载nodejs执行repair即可
- UVALive - 4287 - Proving Equivalences(强连通分量)
Problem UVALive - 4287 - Proving Equivalences Time Limit: 3000 mSec Problem Description Input Outp ...
- Linux之指令 重定向 文件覆盖>和文件追加>>
指令>和>>区别 指令 > : 如果文件存在,将原来文件的内容覆盖:原文件不存在则创建文件,再添加信息. 指令 >>:不会覆盖原文件内容,将内容追加到文件的尾部. ...
- 【js】this问题
var obj = { a: 10, b: () => { console.log(this.a); // undefined console.log(this); // Window {pos ...
- [LeetCode] 4. 寻找两个有序数组的中位数
题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 ...
- 001_ jQuery的表格插件dataTable详解
一. 1.启用id为"datatable1"标签的html的表格jQuery库 $("#datatable1").dataTable( ) Reference: ...
- matlab读取csv文件数据并绘图
circle.m(画二维圆的函数) %该函数是画二维圆圈,输入圆心坐标和半径%rectangle()函数参数‘linewidth’修饰曲线的宽度%'edgecolor','r',edgecolor表示 ...
- MongoDB install
下载地址1:https://www.mongodb.org/dl/linux下载地址2:https://www.mongodb.com/download-center/community关于Mongo ...
- .net core下用HttpClient和asp.net core实现https的双向认证
关于https双向认证的知识可先行google,这时矸接代码. 为了双向认证,我们首先得准备两个crt证书,一个是client.crt,一个是server.crt,有时为了验证是否同一个根证书的验证, ...