应用程序喜欢使用电脑中的资源,而不去考虑他们所使用的资源是否是数据库连接或者是内存中如同堆栈或数组一样的数据。

当有必要的时候可以使用这些资源,但是要尽可能快的释放他们。.NET架构通过使用try/catch/finally来实现这个功能,但是许多开发者发觉反复输入这些语句是一件非常麻烦的事情。也有一些其他的方法可以解决这个繁琐的工作带来的困扰,但是仅仅适用于某些特定条件下。

  对于using关键字的不同看法

  如果你是用C#来开发,你就知道使用关键字,它可以使你的程序更简单的访问这些资源。例如,我如果需要声明一个网络的文本框控制,就需要输入一下语句:

  System.Web.UI.WebControls.TextBox txtName;

  另一方面,如果在代码最上方注明了使用的类型,就可以直接指定,而无需键入完整的路径,标注的类型状态可以是这样的:

  Using System.Web.UI.WebControls;

  如果标注类型使用上面的语句,那么就可以用下面的这条语句来代替上面第一条(System.Web.UI.WebControls.TextBox txtName; )语句:

  TextBox txtName;

  在C#里使用关键字。前面这个语句用于表明这段代码使用一个对象,在这段代码结束的时候,这个对象资源应该被释放掉。下面的代码给出了更好的范例:

 Using (TestObject a = new TestObject()) { 
  // 使用对象

  }

  //调用释放对象的方法

  在处理对象的时候,上面的代码比使用try/catch/finally 要简便的多:

  try {

  TestObject a = new TestObject();

  // 使用对象

  } catch (Exception e) {

  // 处理异常

  } finally {

  TestObject.Dispose();

  }

在这个语句中有一处警告,就是对象必须实现IDisposable这个接口。通过实现接口,你就为这种类型的实例分配它所需要的资源。

IDisposable

  IDisposable接口定义了一个方法--一个释放方法--就是释放那些已被分配出去而并没有在使用的资源。如果你不想代码自动去调用一个不存在的方法,这个方法就显得非常有用。如果你对一个对象使用关键字,而此时还没有实现IDisposable接口,编译器就会返回错误信息。下面这个程序中使用的这个类就是实现IDisposable的代码:

public class TestObject: IDisposable { 
  public TestObject() {

  // 构建代码

  }

  public void Dispose() {

  // 清除管理的资源

  component.Dispose();

  // 你同时需要清楚没有管理的资源

  // 下面一行用于从队列中清除对象,以阻止其进一步的执行

  GC.SuppressFinalize(this);

  }

  }

当你开发你自己的类的时候上面的语句才会派上用场,但是许多类已经具备上述的功能了。一个很好的例子就是与数据库连接在一起运行。

  范例

  数据是企业活力的源泉,几乎所有的应用程序都连接到了后方的数据。利用using语句来处理数据库对象可以为保存键值提供了机会(减少了try/catch/finally的开销)。并且,我利用微软数据接入应用程序块(DAAB)来进一步简化代码,下面摘录的代码显示了如何对于数据库连接使用using函数:

using ( SqlConnection conn = new SqlConnection(Global.CvoneConnection) 
  conn.Open();

  using (SqlTransaction trans = conn.BeginTransaction()) {

  try {

  SqlHelper.ExecuteNonQuery(trans, CommandType.StoredProcedure, "sp_name");

  trans.Commit();

  } catch(Exception ex) {

  trans.Rollback();

  throw ex;

  } } }

代码通过一个数据库事务来传递一个命令给一个SQL数据库服务器(通过已保存的程序)。如果没有如到任何的异常,这个事务就会被接受。请注意,在using函数中,try/catch语言仍然在使用,因为对于处理回滚命令的时候catch是不可少的。同时,因为using函数可以实现清除数据库连接中的对象的操作,所以就不再使用finally函数了。结合使用using关键字和DAAB可以显著的减少代码的编写行数。

  VB.NET开发者

  当有人赞美C#的优点的时候VB.NET开发者经常会非常恼火,但是,就在我写这篇文章的时候,在VB.NET中还没有using函数。我曾经读过各种各样的关于VB.NET下一版本将会包含using关键字的报道,我们拭目以待。我希望using关键字将会包含在VB.NET中,因为它在某些情况下确实非常节省时间。

  总是清除你的垃圾

  最近我和一个客户一起工作,他经历过ASP.NET中漫长的等待时间,因为ASP.NET过多的依赖于SQL服务器。简简单单观察一下数据库服务器中打开的程序就会发现,ASP.NET应用程序打开了数据库连接但却没有关闭它们。在合适的时间关闭连接并释放有关的对象资源,可以大大提高程序的性能。using关键字也可以减轻这种情况的出现,但是VB.NET中却不包含有这种功能。

  虽然说.NET架构提供了自动的碎片整理功能,并且可以发现许多以前老的C++开发者遭遇到的内存问题,但是在架构范围内使用完各种各样的资源以后你仍需要清理一下那些自己不需要的资源。

转载于:https://www.cnblogs.com/greatandforever/archive/2008/07/23/1249307.html

使用using关键字来自动清除对象资源相关推荐

  1. Android 应用开发(12)---可绘制对象资源

    可绘制对象资源 可绘制对象资源是一般概念,是指可在屏幕上绘制的图形,以及可以使用 getDrawable(int) 等 API 检索或者应用到具有 android:drawable 和 android ...

  2. try-with-resource:自动地关闭资源

    目录 一.资源关闭背景 二.JDK7之前的资源关闭方式 三.JDK7及其之后的资源关闭方式 3.1 try-with-resource语法 3.2 实现原理 3.3 异常抑制 3.4 try-with ...

  3. python语法31[with来自动释放对象]

    一 with python中的with的作用是自动释放对象,即使对象在使用的过程中有异常抛出.可以使用with的类型必须实现__enter__ __exit__.我的理解是=try...finally ...

  4. linq to sql中的自动缓存(对象跟踪)

    这篇东西应该至少一年前就写的,不过因为个人太懒,一直没记下来,今天补上. linq to sql中,对于同一个DataContext上下文环境,根据表主键选择记录时(当然这里所指的"记录&q ...

  5. spring boot使用redis缓存数据与自动清除

    在spring boot项目中使用缓存很方便,有如下两种使用场景: 直接操作RedisTemplate缓存数据 在方法上加@Cacheable注解来缓存数据 方法1适用于缓存session.token ...

  6. altium designer 不自动清除回路 清除功能打开失效

    Altium Designer可以自动清除回路,功能打开或关闭控制选项如下: 在布线时,按tab键就可以唤出来. 但是有时候,这个选项勾上了,自动清除功能也没有,就像失效了一样.本人碰到了好多次了,经 ...

  7. @Autowired自动装配对象和new对象的区别

    @Autowired自动装配对象和new对象的区别 @Autowired相当于setter,在注入之前,对象已经实例化,是在这个接口注解的时候实例化的:  而new只是实例化一个对象,而且new的对象 ...

  8. PHP关键字this指向当前对象指针

    PHP关键字this是指向当前对象的指针.我们将和大家一起结合一个范例来细细研究一下PHP关键字this的相关用法和具体功能体现. <?phpclass UserName { //定义属性pri ...

  9. 自动清除html无用css,TinyMCE粘贴HTML代码,避免style属性被自动清除_html/css_WEB-ITnose...

    TinyMCE在粘贴含有style属性的HTML代码时,会自动清除style属性,设置 extended_valid_elements 也只能在Firefox浏览器起作用,Chrome无效. exte ...

  10. chmod命令(chmod函数)自动清除设置用户ID位和设置组ID位

    <UNIX环境高级编程(第2版)> 4.9节 1.chmod自动清除"设置组ID位" user3@SuSE11SP2-1:/home/user1/setgid> ...

最新文章

  1. 程序员的编程能力与编程年龄
  2. 饭后为什么不宜喝冷饮?
  3. 利用cross join 构造大量测试数据
  4. PolarMask:单阶段实例分割框架,FCOS进阶!
  5. 4位加法器的设计代码verilog_一个简单的8位处理器完整设计过程及verilog代码
  6. oracle用hints调优,oracle hints的那点事
  7. 【BZOJ4566】找相同字符,后缀数组
  8. Leecode刷题热题HOT100(2)——两数相加
  9. php代码审计小技巧
  10. FileSync文件同步更新工具
  11. Win10修改注册表,提示无法创建密钥
  12. php编写一个学生类_0063 PHP编程编写学生分数信息编辑和删除功能网页
  13. Hello World CGAL 5.4入门
  14. Js 中实现重定向的几种方式
  15. 性能优化:空间换时间
  16. 亚马逊测评技术一定要懂得以下几点
  17. [CF891D]Sloth
  18. Arduino操控1602 LCD液晶屏
  19. 蔡徐坤一条微博转发过亿 幕后推手被判刑五年
  20. 转移概率矩阵(Transition Probability Matrix)

热门文章

  1. es 在数据量数亿级别提高查询效率?
  2. Spark源码系列(二)RDD详解
  3. Spring Boot + Thymeleaf + Activiti 快速开发平台项目,附源码!
  4. MySQL 磁盘满了,怎么办??
  5. 强烈推荐 16 款 IDEA 插件,让你的开发速度飞起来!
  6. Tomcat爆出严重漏洞,影响所有版本,波及约8万台服务器,附解决方案!(扩散!!!)...
  7. 作为面试官,最近面试 Java 后端的感受!
  8. 分布式系统常见的事务处理机制
  9. pygame 文字输入交互_如何在pygame中创建交互式对象?
  10. 线性回归公式推导与代码实现