using使用注意事项

来源:互联网 发布:质量管理的软件 编辑:程序博客网 时间:2024/05/16 19:39

在C#的语法中,using关键字有几个作用:

 

一、导入一个命名空间,以便于能使用该命名空间下的相关类型定义,如下的实例代码中,将导入System.Text下的相关类型定义

 

 

二、为一个命名空间设置别名,这种情况下并不会导入对应命名空间下的类型定义,如实例代码为System.Text定义了别名SysText,因此在程序中可以直接使用SysText.Type来引用该命名空间下的相关类型定义

 

 

三、限定对象的生存空间,当代码操作退出定义的限定空间时,将自动执行指定对象的Dispose 方法,这通常需要指定对象实现了IDisposable接口

 

 

 

对于上述三种用法,本文不作详细解释。本文想要着重描述的是关于第三种用法中可能存在的“陷阱”问题。

 

using语句在编译时会被展开成如下形式(根据MSDN的文档描述):

 

 

因此,即使是操作执行过程中产生异常,using语句也能保证它所限定的对象能被正常释放。但如果Dispose()方法执行过程中抛出异常,结果会如何呢?这就是using语句的陷阱一:

 

陷阱一:如果对象的Dispose()方法抛出异常,那么使用using语句将不能捕获该异常,并最终导致using语句之后的代码无法被继续执行。使用过WCF客户端代理类的开发者应该知道,WCF客户端代理类在执行Close()方法时是可能抛出异常的,因此如下的代码实现在Close()方法抛出异常之后将导致后续操作无法继续进行。

 

同样是由于Dispose()方法是在finally中执行的,一旦其执行出错,将导致using语句内部产生的异常无法正常抛出,也就不可能被using语句块外的代码捕获。

陷阱二:如果对象Dispose()方法执行出错,将导致using语句内部产生的异常被using语句所“屏蔽”而无法被外界捕获。

如示例代码中如果ob.Dispose()方法执行出错,将导致ApplicationException无法正常被外部代码所捕获。

 

综上,我们总结了using语句在使用中的一些问题,希望能对大家的日常使用提供帮助。