第八节 C#的using语句
前面的代示例展示了如果调用一个类型的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语句的更多相关文章
- JPA学习---第八节:使用JPQL语句进行查询
1.JPQL 语句查询,代码如下: @Test public void query(){ EntityManagerFactory factory = Persistence.createEntity ...
- python第六天 函数 python标准库实例大全
今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...
- whdxlib
1 数据库系统实现 实 验 指 导 书 齐心 彭彬 计算机工程与软件实验中心 2016 年 3 月2目 录实验一.JDBC 应用程序设计(2 学时) ......................... ...
- 2017-12-14python全栈9期第一天第八节之循环语句while
12,while. while 条件: 循环体 无限循环. 终止循环:1,改变条件,使其不成立. 2,break continue
- ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪
ASP.NET MVC深入浅出(被替换) 一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...
- 《C Prime Plus》第八节笔记
第八节 字符输入/输出和输入验证 8.1 单字符I/O:getchar()和putchar() getchar()和putchar()包含在stdio.h头文件中 8.2 缓冲区 无缓冲输入: 直接回 ...
- 【.net 深呼吸】细说CodeDom(2):表达式、语句
在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...
- 将表里的数据批量生成INSERT语句的存储过程 增强版
将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...
- mysql学习之 sql语句的技巧及优化
一.sql中使用正则表达式 select name,email from user where email Regexp "@163[.,]com$"; sql语句中使用Regex ...
随机推荐
- MapHttpRoute
http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Http/HttpRouteCollectionExten ...
- The specified system/compiler is not supported
之前安装了QT的4.5.3版本,现需要用到phonon库,因此卸载后想重新安装4.7版本,但当使用./configure编译时出现The specified system/compiler is no ...
- 组合vs继承
继承,建立子类. 组合(或聚集),在类定义中引用其它类的实例.
- Android打造带透明圆弧的ImageView
这几天因为项目需求,需要在ImageView上面叠加一层透明圆弧,并且在沿着圆弧的方向显示相应的文字,效果如下图所示: 拿到这个需求,首先想到的是自定义一个ImageView来实现此功能,即在onDr ...
- Unity AssetBundles and Resources指引 (三) AssetBundle基础
本文内容主要翻译自下面这篇文章 https://unity3d.com/cn/learn/tutorials/topics/best-practices/guide-assetbundles-and- ...
- 数据结构-多级指针单链表(C语言)
偶尔看到大一时候写了一个多级链表,听起来好有趣,稍微整理一下. 稍微注意一下两点: 1.指针是一个地址,他自己也是有一个地址.一级指针(带一个*号)表示一级地址,他自身地址为二级地址.二级指针(带两个 ...
- python基础(set)补充
1.函数参数(引用) 函数的传参,传的是引用 def func(args): args.appand(123) li=[11,22,33] func(li) print(li) [11,22,33, ...
- c# 生成json数据包
json数据类型,归根到底就是一个字符串,管他里面什么格式,它就是一个字符串来的! 看一个json数据包: { "touser":"OPENID", " ...
- c# 动态调用webserver
object[] paramList = new object[1]; paramList.SetValue("123456",0); //参数值,参数位置 var result ...
- plsql自定义快捷键
说明:如 输入 sf按空格 就变成 SELECT * FROM 输入 w空格 就变成 WHERE 可以帮助你快速的写语句,配置如下图