C#面试题

当前位置: 面试问题网 > C#面试题 > 如何手工释放资源

如何手工释放资源

.NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作。但在以下两种情况需要我们手工进行资源释放:一、由于它无法对非托管资源进行释放,所以我们必须自己提供方法来释放对象内分配的非托管资源,比如你在对象的实现代码中使用了一个COM对象;二、你的类在运行是会产生大量实例(象 GIS 中的Geometry),必须自己手工释放这些资源以提高程序的运行效率
   最理想的办法是通过实现一个接口显式的提供给客户调用端手工释放对象,System 命名空间内有一个 IDisposable 接口,拿来做这事非常合适,省得我们自己再声明一个接口了
   示例:
   using System;
   using System.Collections.Generic;
   using System.Text;
   namespace Example20
   {
   class Program
   {
   class Class1 : IDisposable
   {
   //析构函数,编译后变成 protected void Finalize(),GC会在回收对象前会调用调用该方法
   ~Class1()
   {
   Dispose(false);
   }
   //通过实现该接口,客户可以显式地释放对象,而不需要等待GC来释放资源,据说那样会降低效率
   void IDisposable.Dispose()
   {
   Dispose(true);
   }
   //将释放非托管资源设计成一个虚函数,提供在继承类中释放基类的资源的能力
   protected virtual void ReleaseUnmanageResources()
   {
   //Do something…
   }
   //私有函数用以释放非托管资源
   private void Dispose(bool disposing)
   {
   ReleaseUnmanageResources();
   //为true时表示是客户显式调用了释放函数,需通知GC不要再调用对象的Finalize方法
   //为false时肯定是GC调用了对象的Finalize方法,所以没有必要再告诉GC你不要调用我的Finalize方法
   if (disposing)
   {
   GC.SuppressFinalize(this);
  
   }
  
   }
  
   }
  
   static void Main(string[] args)
  
   {
  
   //tmpObj1没有手工释放资源,就等着GC来慢慢的释放它吧
  
   Class1 tmpObj1 = new Class1();
  
   //tmpObj2调用了Dispose方法,传说比等着GC来释放它效率要调一些
  
   //个人认为是因为要逐个对象的查看其元数据,以确认是否实现了Dispose方法吧
  
   //当然最重要的是我们可以自己确定释放的时间以节省内存,优化程序运行效率
  
   Class1 tmpObj2 = new Class1();
  
   ((IDisposable)tmpObj2).Dispose();
  
   }
  
   }
  
   }

【如何手工释放资源】相关文章

1. 如何手工释放资源

2. 如何杀掉ORACLE里面长期没有释放的锁

3. DIY手工制作经营店创业计划书

4. 《人力资源服务许可证》如何申办

5. 《人力资源服务许可证》如何年检?

6. Spring如何实现资源管理

7. 家乐福人力资源主管谈面试技巧

8. 百度总部人力资源实习生面试经历

9. 海航人力资源面试经验

10. 人力资源管理师的面试经验

本文来源:https://www.mianshiwenti.com/a13020.html

点击展开全部

《如何手工释放资源》

将本文的Word文档下载到电脑,方便收藏和打印

推荐程度:

进入下载页面

﹝如何手工释放资源﹞相关内容

「如何手工释放资源」相关专题

其它栏目

也许您还喜欢