IDisposable资源释放接口

微软自带的注释摘要

// 摘要:

//     定义一种释放分配的资源的方法。

[ComVisible(true)]

public interface IDisposable

{

// 摘要:

//     执行与释放或重置非托管资源相关的应用程序定义的任务。

void Dispose();

}

此接口的主要用途是释放非托管资源。 当不再使用托管对象时,垃圾回收器会自动释放分配给该对象的内存。 但无法预测进行垃圾回收的时间。 另外,垃圾回收器对窗口句柄或打开的文件和流等非托管资源一无所知。

将此接口的 Dispose 方法与垃圾回收器一起使用来显式释放非托管资源。 当不再需要对象时,对象的使用者可以调用此方法

因为 IDisposable.Dispose 实现由类型的使用者调用时,实例属于自己的资源不再需要,您应将包装在 SafeHandle (建议使用的替代方法) 的托管对象,则应该重写Object.Finalize 来释放非托管资源,忘记在使用者调用 Dispose条件下。

使用对象实现 IDisposable

才能直接,使用非托管资源需要实现 IDisposable。 如果应用程序使用对象实现 IDisposable,不提供 IDisposable 实现。 而,那么,当您使用时完成,应调用对象的IDisposable.Dispose 实现。 根据编程语言中,可以为此使用以下两种方式之一:

  • 使用一种语言构造 (在 C# 和 Visual Basic 中的 using 语句。
  • 通过切换到实现 IDisposable.Dispose 的调用在 try/catch 块。
//使用一种语言构造 (在 C# 和 Visual Basic 中的 using 语句
using System;using System.IO;using System.Text.RegularExpressions;public class WordCount
{
   private String filename = String.Empty;
   private int nWords = 0;
   private String pattern = @"\b\w+\b"; 

   public WordCount(string filename)
   { 
        if (! File.Exists(filename))
                 throw new FileNotFoundException("The file does not exist.");
        this.filename = filename;
        string txt = String.Empty;
        using (StreamReader sr = new StreamReader(filename))
        {
             txt = sr.ReadToEnd();
             sr.Close();
         }
         nWords = Regex.Matches(txt, pattern).Count;
   } 
   public string FullName
   {
        get {
         return filename; 
         } 
    }
    public string Name
   {
         get { 
             return Path.GetFileName(filename); 
         } 
    }
    public int Count 
   { 
           get { 
               return nWords; 
           } 
   }
}
using System;
using System.IO;
using System.Text.RegularExpressions;
public class WordCount
{   
private String filename = String.Empty;   
private int nWords = 0;   
private String pattern = @"\b\w+\b"; 

   public WordCount(string filename)
   { 
        if (! File.Exists(filename))
                 throw new FileNotFoundException("The file does not exist.");      
       this.filename = filename;      
       string txt = String.Empty;
       StreamReader sr = null;
       try {
         sr = new StreamReader(filename);
         txt = sr.ReadToEnd();
         sr.Close();
      }catch {
      
      }
      finally {
               if (sr != null) sr.Dispose();     
      }
      nWords = Regex.Matches(txt, pattern).Count;
   } 
   public string FullName
   { 
       get {
        return filename; 
        } 
    }
    public string Name
   { 
       get { 
           return Path.GetFileName(filename); 
           } 
   }
   public int Count 
   { 
       get { 
           return nWords; 
           } 
    }
}
时间: 2024-08-27 11:21:55

IDisposable资源释放接口的相关文章

泛型的资源释放

C#泛型是一种高复用性.安全和高效的技术,通过类型参数可以将参数的声明.实现推迟到客户代码中.但是这种延迟却降低了类型参数在泛型定义中的可操作性.例如资源释放. public interface IWorker { void Operate(); } public class GenericWorker<T> where T : IWorker , new() { public void GetResult() { T worker=new T(); worker.Operate(); } }

深刻理解C#中资源释放

今天我的一个朋友看到我写的那篇<C#中用AJAX验证用户登录>时,给我指出了点小毛 病.就是在用户登录时,如果用户登录失败,在下面这段代码中,都会new出来一个User对象,如果连续登录失败多次,就会生成多个User对象,而它们 在登录失败后已经无用了,依然占据着内存,就算是C#有垃圾回收机制,但不确定什么时候对这些对象进行回收.然后去网上找了一篇C#资源释放的文章,讲的很透彻,和大家分享一下. using System;using System.Collections.Generic;usi

.net 资源释放(托管资源和非托管资源)

1.托管资源 像int.float.DateTime等都是托管资源:net中80%的资源都是托管资源: 托管资源的回收通过GC(垃圾回收器)自动释放分配给该对象的内存,但无法预测进行垃圾回收的时间,我们无法控制系统在什么时间回收资源. 2.非托管资源 像ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,Odbc

资源释放的问题

转 个人体悟,析构貌似有点鸡肋了,不能显示调用,不也确定调用时机,应该只是做为一种释放资源机制的存在 然后,一个实例类的资源释放应在承载它的方法结束时发生,所以做为主程序结束标志的main函数里才不能写一些冗杂的方法在里面,应把方法写在主程序外面,要用的时候调用一下这样可以省资源.而且有复用性.不知道我这样理解是否有问题.若有不对之处,还请指点,入门新人! C#中Dispose.析构函数.close的区别 本文导读:C#中析构函数 和 Dispose 都是释放资源,析构函数用于 隐式释放资源,D

C#资源释放及Dispose、Close和析构方法

备注:此文的部分观点有误,之所以仍旧保留本文,是需要在后期给出一个勘误版.正确的版本在这里“C#中标准Dispose模式的实现” 一:什么是资源 在开始本文前,需要一些准备知识.首先要提出“什么是资源”.在CLR出来之后,Windows系统资源开始分为“非托管资源”和“托管资源”. 非托管资源是指:所有的Window内核对象(句柄)都是非托管资源,如对于Stream,数据库连接,GDI+的相关对象,还有Com对象等等,这些资源并不是受到CLR管理: 托管资源是指:由CLR管理分配和释放的资源,即

opencv资源释放问题

初学opencv,资源释放问题困扰了好久.感觉小有体会,仅供菜鸟参考. 资源要不要释放主要看是否真正在内存开辟空间.简单点说就是有Creat开辟空间,才有Release的释放空间.当然实际情况要更复杂,比如clone()等深复制.总之还是要看是否真正在内存开辟空间. 具体的参考一下以下3篇文章吧 http://blog.csdn.net/scudz/article/details/8083866 http://blog.csdn.net/liulina603/article/details/84

cocos2dx loading界面 预加载资源 与 资源释放

预加载图片: 1.CCTextureCache::sharedTextureCache()->addImage("icon.png"); 2.CCTextureCache::sharedTextureCache()->addImageAsync("icon.png",this,callfuncO_selector(MainLayerLoading::loadingCallBack)); 使用加载的缓存图片: CCSprite* sp =CCSprite:

oracle for update锁表资源释放之kill -9和alter system kill session &#39;sid,serial#&#39;;

通过for update锁表,通过操作系统方式和oracle方式终止进程方式 --查询需要终止进程的情况,包括操作系统进程 select proc.sPID, sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao, v$session sess,v$process proc where a

JDBC的资源释放

1.1.1?JDBC资源释放 JDBC程序执行结束后,将与数据库进行交互的对象释放掉,通常是ResultSet,Statement,Connection. 这几个对象中尤其是Connection对象是非常稀有的.这个对象一定要做到尽量晚创建,尽早释放掉. l 将资源释放的代码写入到finally的代码块中. l 资源释放的代码应该写的标准: if(rs !=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(