C#处理非托管资源
2024-10-12 12:43:10
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())
{
//...
} }
}
}
最新文章
- Android之debug---menu的getActionView()return null
- C# 使用IEnumerable,yield 返回结果,同时使用foreach时,在循环内修改变量的值无效(二)
- 【C语言入门教程】5.6 函数库和文件
- 分佈式事務故障處理暨ORA-24756: transaction does not exist處理
- Beta阶段站立会议-01
- POJ1364 King-差分
- JVM的启动流程
- mke2fs/mks.etc3/fstab/mount指令
- MyEclipse的快捷使用(含关联源码和Doc的方式)
- C#关于静态与非静态的区别
- Invitation Cards(邻接表+逆向建图+SPFA)
- Request.ServerVariables详细说明
- Java NIO之套接字通道
- 和初学者交流学习java语言一些体会。
- Kotlin基础(四)Lambda编程
- 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据
- 计蒜客 31436 - 提高水平 - [状压DP]
- 解决input 有readonly属性 各个浏览器的光标兼容性问题
- 脱壳_00_压缩壳_ASPACK
- Codeforces Round #369 (Div. 2) B. Chris and Magic Square 水题