C#中using语句的用法

一、using语句

using可以算是.NET中新的语法元素,它清楚地说明一个通常比较占用资源的对象何时开始使用和何时被手动释放。当using可以被使用时,建议尽量使用using语句。至今为止,使用using语句发现它带给程序员的只有优点,而没有任何弊端。

在.NET的环境中,托管的资源都将由.NET的垃圾回收机制来释放,而一些非托管的资源则需要程序员手动地将它们释放。.NET提供了主动和被动两种释放非托管资源的方式,即IDisposable接口的Dispose方法和类型自己的Finalize方法。任何带有非托管资源的类型,都有必要实现IDisposable的Dispose方法,并且在使用完这些类型后需要手动地调用对象的Dispose方法来释放对象中的非托管资源。

如果类型正确地实现了Finalize方法,那么即使不调用Dispose方法,非托管资源也最终会被释放,但那时资源已经被很长时间无畏地占据了。

using语句的作用就是提供了一个高效的调用对象Dispose方法的方式。对于任何IDisposable接口的类型,都可以使用using语句,而对于那些没有实现IDisposable接口的类型,使用using语句会导致一个编译错误。

先来看一个using语句的基本语法:

using(StreamWriter sw= new StreamWriter())
{
    // 中间处理逻辑
}

在上面代码中,using语句一开始定义了一个StreamWriter的对象,之后在整个语句块中都可以使用sw,在using语句块结束的时候,sw的Dispose方法将会被自动调用。using语句不仅免除了程序员输入Dispose调用的代码,它还提供了机制保证Dispose方法被调用,无论using语句块顺利执行结束,还是抛出了一个异常。下面的代码演示了using的这一保护机制。

using System;

namespace usingDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 使用using
                using (MyDispose md = new MyDispose())
                {
                    md.DoWork();
                    // 抛出一个异常来测试using
                    throw new Exception("抛出一个异常");
                }
            }
            catch
            {

            }
            finally
            {
                Console.ReadKey();
            }
        }
    }

    /// <summary>
    /// 继承自IDisposable接口,仅仅用来做测试,不使用任何非托管资源
    /// </summary>
    public class MyDispose : IDisposable
    {
        public void Dispose()
        {
            Console.WriteLine("Dispose方法被调用");
        }
        public void DoWork()
        {
            Console.WriteLine("做了很多工作");
        }
    }
}

在上面的代码中,using语句块抛出了一个异常,而该异常知道using语句结束后才被捕获。由于有了using语句的存在,即使异常被抛出,MyDispose的对象md的DIspose方法仍然被调用。 。程序输出结果如下:

事实上,C#编译器为using语句自动添加了try/finally块,所以Dispose方法能够保证被调用到,所以如下两段代码经过编译后内容将完全一致:

using (MyDispose md = new MyDispose())
{
      md.DoWork();
}

MyDispose md;
try
{
    md = new MyDispose();
    md.DoWork();
}
finally
{
    md.Dispose();
}

在彻底了解了using的实现原理以后,还应该注意一点使用using时常犯的错误,那就是千万不要试图在using语句块外初始化对象 ,如下面代码所示:

MyDispose md = new MyDispose();
using (md)
{
    md.DoWork();
}

看上去似乎没有任何问题,但是在多线程的程序中,上述代码就会有隐患。试想当md被初始化后程序突然产生一个异常而中断,那md对象中的非托管资源将没有机会得到释放,这对于系统来说危害是相当大的。所以在任何时候都应该在using语句中初始化需要使用的对象。

二、总结

using语句为实现了IDisposable的类型对象调用Dispose方法,using语句能够保证使用的对象的Dispose方法在using语句块结束时被调用,无论是否有异常被抛出。C#编译器在编译时自动为using语句加上try/finally块,所以using的本质和异常捕获语句一样,但是语法更为简洁。所有using使用的对象都应该在using语句开始后再初始化,以保证所有的对象都能够被Dispose。

到此这篇关于C#中using语句用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#中using的三种用法

    using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型. 为命名空间创建别名. using 关键字还用来创建 using 语句  定义一个范围,将在此范围之外释放一个或多个对象. 请参见 using 语句.http://www.yaosansi.com/blog/article.asp?id=669 using namespace; using alias = type|namespace;  参数 Alias  您希望用来表示命名空间或类型的用户定义符号

  • C# using语法糖图文详解

    前言 什么是语法糖? (语法糖就是像糖一样的语法-) 语法糖(Syntactic sugar),又名糖衣语法,最早是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的. 通俗点来讲就是简化后的语法,但是其效果和原先语法是一样的,只是更方便我们程序员使用而已. 举个日常生活中简单的例子,使用语法糖之前你想表达今天天气很热:"今天气温好热啊!",用了语法糖后:"天热!", 但是效果是一样的,都能够给别人传达今天天气很热的信息. 很多语言都有语法糖

  • 谈C# using的用法与好处

    之前的一篇文章中的代码中有一个using的用法,刚开始查看了一些资料说是强制关闭对象的一个命令.今天又查了一些资料,才明白,原来using指令调用了一个方法--Dispose()方法.而Dispose()方法的作用就是释放所有的使用资源. 例: public void ExecuteCommand( string connString, string commandString ) { SqlConnection myConnection = new SqlConnection( connStr

  • C# using三种使用方法

    C# using 三种使用方式介绍 1.using指令.using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到. 例如:using System; 一般都会出现在*.cs中. 2.using别名.using + 别名 = 包括详细命名空间信息的具体的类型. 这种做法有个好处就是当同一个cs引用了两个不同的命名空间,但两个命名空间都包括了一个相同名字的类型的时候.当需要用到这

  • C#中using指令的几种用法

    C#中using指令的用法 1.using指令 using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到. 例如: using System; using System.Data; 2.using别名 using + 别名 = 包括详细命名空间信息的具体的类型. 这种做法有个好处就是当同一个cs引用了两个不同的命名空间,但两个命名空间都包括了一个相同名字的类型的时候.当需要用

  • python中循环语句while用法实例

    本文实例讲述了python中循环语句while用法.分享给大家供大家参考.具体分析如下: 对于python的while语句,注意其缩进即可. python和其他语言一样也有break和continue,分别用来表示跳出循环和继续循环. #!/usr/bin/python # Simple while loop a = 0 while a < 15: print a, # 在print a后面加,不换行 if a == 10: print "made it to ten!!" a

  • python中if-elif-else语句实例用法讲解

    1.判断多个条件的语句,if为真则执行if后面的语句. 2.如果elif是真的,则执行elif,后面的代码块不执行. 3.如果if和elif不满意,执行else语句. 实例 if expression: statements... elif expression: statements... # 可以有1条或多条elif语句 else: statement... 知识点扩充: 有的时候,一个 if - else - 还不够用.比如,根据年龄的划分: 条件1:18岁或以上:adult 条件2:6岁

  • MySQL中EXPLAIN语句及用法实例

    目录 前言 EXPLAIN 语法如下: 1.获取表结构 2.获取执行计划信息 3.使用 EXPLAIN ANALYZE 获取信息 总结 前言 在MySQL中 DESCRIBE 和 EXPLAIN 语句是相同的意思.DESCRIBE 语句多用于获取表结构,而 EXPLAIN 语句用于获取查询执行计划(用于解释MySQL如何执行查询语句). 通过 EXPLAIN 语句可以帮助我们发现表格的哪些字段上需要建立索引,用于加速查询.也可以使用 EXPLAIN 检查优化器是否使用最优的顺序来连接表. EXP

  • SQL中where语句的用法及实例代码(条件查询)

    目录 1.where语法和用法 (1)语法:where <criteria> 即where <查询条件> (2)用法:获取满足一定条件的目标数据. 2.实例 (1)单一条件查询 (2)多条件查询 补充:引号的使用 总结 1.where语法和用法 (1)语法:where <criteria> 即where <查询条件> 具体查询语句:select <字段> from <表名> where <查询条件> 说明:①多个条件则用“

  • C#中using语句的用法

    一.using语句 using可以算是.NET中新的语法元素,它清楚地说明一个通常比较占用资源的对象何时开始使用和何时被手动释放.当using可以被使用时,建议尽量使用using语句.至今为止,使用using语句发现它带给程序员的只有优点,而没有任何弊端. 在.NET的环境中,托管的资源都将由.NET的垃圾回收机制来释放,而一些非托管的资源则需要程序员手动地将它们释放..NET提供了主动和被动两种释放非托管资源的方式,即IDisposable接口的Dispose方法和类型自己的Finalize方

  • 详解Python中break语句的用法

    在Python中的break语句终止当前循环,继续执行下一个语句,就像C语言中的break一样. break最常见的用途是当一些外部条件被触发,需要从一个循环中断退出. break语句可以在while和for循环使用. 如果正在使用嵌套循环(即一个循环里内嵌另一个循环),break语句可以用于停止最内层循环的执行,并执行外循环的下一行代码的程序. 语法 在Python中break语句的语法如下: break 流程图: #!/usr/bin/python for letter in 'Python

  • 详解Python中with语句的用法

    引言 with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with 语句相关部分介绍).with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的"清理"操作,释放资源,比如文件使用后自动关闭.线程中锁的自动获取和释放等. 术

  • sql中case语句的用法浅谈

    SQL中Case的使用方法 Case具有两种格式.简单Case函数和Case搜索函数. 复制代码 代码如下: --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END 这两种方式,可以实现相同的功能.简单Case函数的写法相对比较简洁,但是和Case搜索函数相比

  • 几种有用的变型 PHP中循环语句的用法介绍

    PHP手册中对它的语法定义如下: for (expr1; expr2; expr3) statement 下面说说for语句几种有用的变型. 1.无限循环 首先是人尽皆知的无限循环(亦可称"死循环").由于空表达式null在语法上是有效的,所以我们可以把for语句的三个表达式留空,这样就会产生不断执行for嵌套语句的效果. for (;;) { //放置需要不断执行的语句 } ?> 虽然有一些任务会使用到无限循环,但是大多数程序任务,特别是PHP所能涉及的领域,在使用无限循环时都

  • Python中Continue语句的用法的举例详解

    Python continue语句返回while循环的开始.Continue语句拒绝在该循环的当前迭代中的其余语句执行并移动控制返回到循环的顶部(开始位置). continue语句可以在while和for循环使用. 语法 Python continue语句的语法如下: continue 流程图: 例子 #!/usr/bin/python for letter in 'Python': # First Example if letter == 'h': continue print 'Curren

随机推荐