C# using语句使用心得总结

开发 后端
这里是关于C# using语句使用心得总结,using关键字是大家用的比较多的,一般都是用在为命名空间创建别名上。希望本文能对大家有所帮助。

C# using语句用于定义一个范围,在此范围的末尾将释放对象,这样的用法比较少见,常见于非托管资源。这些资源在使用后,就必须彻底释放。

学习过C#的人都知道,using是关键字。在MSDN里面一查C#参考(C# Reference),using关键字就会有两个主要用途:

1、作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。请参见[using 指令]。

2、作为C# using语句,用于定义一个范围,在此范围的末尾将释放对象。请参见[using 语句]。

其中,第1点就是我们所熟悉using的使用方法,而第二种C# using语句方法我们就比较少用了,它常见于非托管资源(也就是在C++编程里面可能碰到的句柄和设备上下文),这些资源使用完毕后,是必须释放的。在C#里面,由于完全的面向对象编程,这些资源类型都实现了IDisposable接口,因此会使用在捕获异常try...catch语句的finally块中释放资源,代码如下:

{  
  Font font1 = new Font("Arial", 10.0f);  
  try  
  {  
    byte charset = font1.GdiCharSet;  
  }  
  finally  
  {  
    if (font1 != null)  
      ((IDisposable)font1).Dispose();  
  }  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

这样确保调用Dispose,从而保证释放资源。(请注意,使用额外的大括号为对象创建有效的范围而此时如果使用using语句,同样能够获得相同的结果,代码如下:

using (Font font3 = new Font("Arial", 10.0f), font4 = new Font("Arial", 10.0f))  
{  
    // Use font3 and font4.  

  • 1.
  • 2.
  • 3.
  • 4.

using语句按照正确的方式调用对象上的Dispose方法,并(在您按照前面所示方式使用它时)会导致在调用 Dispose 时对象自身处于范围之外。在using块中,对象是只读的并且无法进行修改或重新分配。

同时还要注意的一点是:

按照规则,当使用IDisposable对象时,应在using语句中声明和实例化此对象。虽然可以在using语句外实例化资源对象,代码如下:

Font font2 = new Font("Arial", 10.0f);  
using (font2) // not recommended  
{  
    // use font2  
}  
// font2 is still in scope  
// but the method call throws an exception  
float f = font2.GetHeight();  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

在这种情况下,该对象将在控制权离开 using 块之后保持在范围内,即使它可能将不再具有对其非托管资源的访问权也是如此。换句话说,再也不能完全初始化该对象。如果试图在 using 块外部使用该对象,则可能导致引发异常,如上述代码段3中的font2.GetHeight()调用而产生异常。由于这个原因,通常最好是在 using 语句中实例化该对象并将其范围限制在 using 块中。

在这一点上,如果再使用ildasm工具一查,就会看到代码段1和代码段2生成的代码几乎是完全一样的,而这样使用使用using语句的方式更加简洁、方便。

本文来自liput博客园文章《C# using指令 心得总结

【编辑推荐】

  1. C#创建Windows服务详细介绍
  2. C#动态编译简单剖析
  3. C#静态字段与实例字段分析
  4. C#匿名方法详细剖析
  5. C#命名属性简单描述
责任编辑:彭凡 来源: 博客园
相关推荐

2010-02-01 10:15:07

C++ TinyXML

2009-08-31 10:00:07

C#静态变量

2009-08-24 17:27:05

C#泛型应用

2011-01-19 14:57:09

Thunderbird

2011-03-15 11:05:03

2009-06-19 11:09:27

Spring AOP

2010-06-01 13:42:37

TortoiseSVN

2010-08-06 11:12:38

FlexCairngorm框架

2011-01-07 11:14:17

Nginx负载均衡负载均衡

2011-05-23 13:27:53

2009-08-25 16:49:44

C#使用if语句

2011-09-01 10:16:43

JQuery Mobi

2024-04-16 12:13:07

usingC#开发

2009-06-26 16:12:08

ThickboxjQuery

2010-03-02 17:33:49

Android 2.0

2009-08-26 14:01:33

C# using用法

2009-08-25 16:56:52

C#使用块来分组语句

2009-08-11 11:42:50

Ruby使用心得

2009-08-25 16:32:24

C#语言

2009-08-26 17:22:09

C#语言
点赞
收藏

51CTO技术栈公众号