前面的代示例展示了如果调用一个类型的Dispose或Close方法。如果决定显式的调用这两个方法之一,强烈建议吧他们放在一个异常处理finally块中。这样可以保证清理代码得到执行,因此,前代码示例可以修改成下面这种更好的形式:

static void Main(string[] args)

{

Byte[] byteWrite = new Byte[] { 1, 2, 3, 4, 5 };

FileStream fs = new FileStream("Temp.dat", FileMode.Create);

try

{

fs.Write(byteWrite, 0, byteWrite.Length);

}

finally

{

if (fs != null)

fs.Dispose();

}

File.Delete(@"d:\用户目录\我的文档\visual studio 2010\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\Temp.dat");

}

添加异常处理代码时正确的,而且应该坚持这么做。幸好,c#提供了using语句,它提供了一种简化的语法来获得和上面代码相同的结果。下面演示了如何使用C#的using语句重写上面代码:

static void Main(string[] args)

{

Byte[] byteWrite = new Byte[] { 1, 2, 3, 4, 5 };

using (FileStream fs = new FileStream("Temp.dat", FileMode.Create))

{

fs.Write(byteWrite, 0, byteWrite.Length);

}

File.Delete(@"d:\用户目录\我的文档\visual studio 2010\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\Temp.dat");

}

在using语句中,我们初始化一个对象,并将它的引用保存到一个变量中。然后再using语句的大括号里访问该变量。编译这段代码时,编译器自动生成一个try块和一个finally块,在finally中,编译器会生成代码将变量转型成一个IDisposable并调用Dispose方法。显然,using语句只能用于那些实现了IDisposable接口的类型。

注意:c#语句支持初始化多个变量,只要这些变量的类型相同。另外,using语句还允许只使用一个已初始化的变量,

Using语句也能用于实现了IDisposable的值类型。这样一来,我们就可以创建一个非常高效和有用的机制来封装”开始和结束一个操作”所需的代码。例如,假设要用一个Mutex对象来锁定一个代码块。Mutex类确实实现了IDisposable接口,但是在它上面调用dispose方法只会释放本地资源;不会对锁本身进行任何处理。为了简化锁定和解锁一个Mutex操作,可以定义一个值类型来封装Mutex对象的锁定和解锁操作。下面的MUTEXLOCK结构就是一个例子,随后的Main方法演示了如何高效的使用MutexLock结构。

class Program

{

static void Main(string[] args)

{

Mutex m = new Mutex();

using (new MutexLock(m))

{

}

}

}

struct MutexLock : IDisposable

{

private readonly Mutex m_mutex;

public MutexLock(Mutex m)

{

m_mutex = m;

m_mutex.WaitOne();

}

public void Dispose()

{

m_mutex.ReleaseMutex();

}

}

第八节 C#的using语句的更多相关文章

  1. JPA学习---第八节:使用JPQL语句进行查询

    1.JPQL 语句查询,代码如下: @Test public void query(){ EntityManagerFactory factory = Persistence.createEntity ...

  2. python第六天 函数 python标准库实例大全

    今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...

  3. whdxlib

    1 数据库系统实现 实 验 指 导 书 齐心 彭彬 计算机工程与软件实验中心 2016 年 3 月2目 录实验一.JDBC 应用程序设计(2 学时) ......................... ...

  4. 2017-12-14python全栈9期第一天第八节之循环语句while

    12,while. while 条件: 循环体 无限循环. 终止循环:1,改变条件,使其不成立. 2,break continue

  5. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  6. 《C Prime Plus》第八节笔记

    第八节 字符输入/输出和输入验证 8.1 单字符I/O:getchar()和putchar() getchar()和putchar()包含在stdio.h头文件中 8.2 缓冲区 无缓冲输入: 直接回 ...

  7. 【.net 深呼吸】细说CodeDom(2):表达式、语句

    在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...

  8. 将表里的数据批量生成INSERT语句的存储过程 增强版

    将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...

  9. mysql学习之 sql语句的技巧及优化

    一.sql中使用正则表达式 select name,email from user where email Regexp "@163[.,]com$"; sql语句中使用Regex ...

随机推荐

  1. locals()函数访问当前还在作用范围内的局部变量

    >>> element = 'silver' >>> number = 47 >>> 'Element {number} is {element} ...

  2. php文字水印和php图片水印实现代码

    本文章向码农们介绍php文字水印和php图片水印实现代码,需要的码农可以参考一下. php 文字水印 文字水印就是在图片上加上文字,主要使用gd库的imagefttext方法,并且需要字体文件. 实现 ...

  3. Qt编译安装后中文无法显示问题

    闲的蛋疼,把Ubuntu删了,再装10.04的时候,QT编译后运行自己的程序已经不能显示中文了,只能显示英文,字体贼丑... 想了各种办法,都没解决.. 最后:终于搞定: apt-get instal ...

  4. OC基础(26)

    集合对象的内存管理 Copy copy与内存管理 @property中的copy关键字 自定义的类实现copy操作 *:first-child { margin-top: 0 !important; ...

  5. HDU1325

    http://acm.split.hdu.edu.cn/showproblem.php?pid=1325 #include<stdio.h> #include<algorithm&g ...

  6. python写的battle ship小游戏 - 1.0

    最近学python,这是今天写的一个小游戏. from random import randint class Board(object): board = [] def __init__(self, ...

  7. html5标签css3的常用样式

    <meta name=''> name:有如下6个值:application-name:文档名或者应用名,整个文档只能包含一个值.author:文档作者description:文档描述ge ...

  8. Beginning SDL 2.0(1) SDL功能简介

    原文链接为 http://wiki.libsdl.org/Introduction. 由于近期整理音视频可视化的技术,发现好久不更新的SDL发布了2.0版本,以前也没有过于关注,这里准备尝试下.了解S ...

  9. Java虚拟机内存模型及垃圾回收监控调优

    Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存 ...

  10. Web 项目 中读取专用配置文件

    在 web 开发中,有时我们要为 业务逻辑处理 配置专用的 配置文件,也就是 xml 文件,这样可以极大的方便维护工作,但是读取 专用的配置文件还需要自己写一个方法,在这里,我封装了一个公用 的方法: ...