泛型的资源释放

C#泛型是一种高复用性、安全和高效的技术,通过类型参数可以将参数的声明、实现推迟到客户代码中。但是这种延迟却降低了类型参数在泛型定义中的可操作性。例如资源释放。

public interface IWorker
{
        void Operate();
}

public class GenericWorker<T>
        where T : IWorker , new()
{
        public void GetResult()
        {
              T worker=new T();
              worker.Operate();
        }
}

但是如果T实现了IDisposable接口,则上面代码可能存在资源泄露的风险。但是由于不知道T是否实现了IDisposable接口,所以不能直接释放资源。对于这个问题可以使用下面语法,利用编译器的特性进行资源释放:

1 public void GetResult()
2 {
3         T worker = new T();
4         using (worker as IDisposable)
5         {
6              worker.Operate();
7         }
8 }

对于上面的代码,编译期会分配一个本地变量,存放worker转为IDisposable的结果。如果T未实现IDisposable接口,那么本地变量为null,那么编译器就不会执行Dispose(),否则会执行Dispose()。

若泛型类中需要实例化某个类型参数为成员变量,那么情况就会变复杂。此时的成员变量可能需要释放资源,对于这种情况可以通过使泛型类实现IDisposable接口解决:

 1     public sealed class GenericWorker<T> : IDisposable
 2             where T : IWorker, new()
 3     {
 4         private T worker;
 5
 6         public void GetResult()
 7         {
 8             if (worker == null)
 9                 worker = new T();
10             using (worker as IDisposable)
11             {
12                 worker.Operate();
13             }
14         }
15
16         public void Dispose()
17         {
18             using (IDisposable tmp = worker as IDisposable)
19             {
20
21             }
22         }
23     }

不过上面代码可以改为IDisposable模式就更完美了。

时间: 2024-10-25 17:45:27

泛型的资源释放的相关文章

opencv资源释放问题

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

深刻理解C#中资源释放

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

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

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

.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管理分配和释放的资源,即

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(

数据库连接资源释放

项目运行过程中遇到了tomcat连接池资源不释放,导致系统崩溃的问题. 查找各种网站,在数据库中进行如下配置 (tomcat): 1.initialSize :连接池启动时创建的初始化连接数量 2.maxActive :连接池中可同时连接的最大的连接数 3.maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制 4.minIdle:连接池中最小的空闲的连接数,低于这个数量会被创建新的连接 5.maxWait  :最大等待时间,当没有可用连接时,连接池等待连接