using语句
某些类型的非托管对象有数量限制或很耗费系统资源, 在代码使用完他们后, 尽快释放他们是很重要的using语句有助于简化这一过程, 并确保这些资源被适当的处理
(0)资源
指实现了System.IDisposable接口的类或结构. IDisposalbe接口中有个Dispose的方法, 使用这个方法去处置资源
-
如果正在使用的资源那部分代码中产生了一个异常的运行时错误, 那么可能处置资源的代码无法执行
(1)包装资源的使用
using语句帮助减少意外的运行时错误带来的潜在的问题, 整洁的包装了资源的使用
using(分配资源) 使用资源
using(ResourceType Identifier Expression) Statement
-
圆括号内代码表示分配资源
-
Statement是使用资源代码
-
using语句隐式产生处置该资源的代码
-
分配资源
-
把Statement放入try块
-
创建资源的Dispose方法的调用, 并把它放入finally块
-
例子
static void Main(string[] args)
{
//打开一个文本文件, 并向其中写入一行
using (TextWriter tw = File.CreateText("Lin.txt"))
{
tw.WriteLine("123123lin");
}
//打开相同的文本文件, 一行一行读取并显示它的内容
using (TextReader tr = File.OpenText("Lin.txt"))
{
string InputString;
while((InputString = tr.ReadLine()) != null)
{
Console.WriteLine(InputString);
}
}
}
(3)多个资源和嵌套
声明相同类型的多个资源
using(ResourceType Id1 = Expr1, Id2 = Expr2) Statement
嵌套声明
using(ResourceType Id1 = Expr1)
{
Statement;
using(ResourceType id2 = Expr2)
{
Statement;
}
}
例子
using (TextWriter tw1 = File.CreateText("Lin.txt"),
tw2 = File.CreateText("Fra.txt"))
{
tw1.WriteLine("123123lin");
tw1.WriteLine("123123fra");
}
using (TextReader tr1 = File.OpenText("Lin.txt"),
tr2 = File.OpenText("Fra.txt"))
{
string InputString;
while ((InputString = tr1.ReadLine()) != null)
{
Console.WriteLine(InputString);
}
while ((InputString = tr2.ReadLine()) != null)
{
Console.WriteLine(InputString);
}
}
using (TextWriter tw1 = File.CreateText("Lin.txt"))
{
tw1.WriteLine("123123lin");
using (TextWriter tw2 = File.CreateText("Fra.txt"))
tw1.WriteLine("123123fra");
}
using (TextReader tr1 = File.OpenText("Lin.txt"),
tr2 = File.OpenText("Fra.txt"))
{
string InputString;
while ((InputString = tr1.ReadLine()) != null)
{
Console.WriteLine(InputString);
}
while ((InputString = tr2.ReadLine()) != null)
{
Console.WriteLine(InputString);
}
}
(4)提前声明形式
TextWriter tw = File.CreateText("lin.txt");
using (tw)
{
tw.WriteLine("123123lin");
}
-
虽然这样也能保证使用完整资源后总是会调用Dispose方法
-
但它不能防止在using语句已经释放了它的非托管资源后使用该资源
-
这可能会导致状态不一致, 提供了较少的保护, 不推荐