C#学习笔记 - using语句

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语句已经释放了它的非托管资源后使用该资源

  • 这可能会导致状态不一致, 提供了较少的保护, 不推荐

posted on 2023-05-24 16:46  老菜农  阅读(25)  评论(0编辑  收藏  举报

导航