代码中,经常会使用using语句引用命名空间或定义类的别名;本课,我们将了解using关键字的另一个用途,即使用using语句结构引用对象,对象使用结束后可以自动释放资源。

使用using语句结构对象的前提是,对象的类型必须实现IDisposable接口。首先来看一个using语句结构和IDisposable接口的基本工作方式,如下面的代码,我们定义了一个名为CDisposable的类。

using System;

namespace ConsoleTest
{
    public class CDisposable :IDisposable
    {
        // 构造函数
        public CDisposable()
        {
            Console.WriteLine("创建对象...");
        }
        // 释放资源
        public void Dispose()
        {
            Console.WriteLine("自动释放资源...");
        }
    }
}

本例中,CDisposable类实现了IDisposable接口,其中实现了Dispose()方法,此方法就是用于自动释放资源的地方。下面的代码,我们使用using语句结构测试自动释放资源机制的有效性。

static void Main(string[] args)
{
        using (CDisposable d = new CDisposable())
        {

        }
}

代码执行结果如下图所示。

enter image description here

我们可以看到,在using关键字的后面的一对小括号里定义了对象d,然后,在using后的一对花括号定义的语句块中就可以使用这个对象,最后,当语句块执行完成后,就会自动调用对象中的Dispose()方法,也就是执行自动释放资源的操作。

在.NET Framework类库中,有很多实现了IDisposable接口的类型,使用这些资源时,可以简化代码的书写,并且,无论代码是否正确运行,对象都可以自动释放资源,以减少不必要的资源占用,特别是有效避免了在出错时资源无法回收的情况。

如后面课程需要使用的绘图、数据库等操作,都大量的应用了实现IDisposable接口的类型, 这些操作会占用大量的内存和网络资源,所以,自动回收资源的操作显得更加重要,如连接SQL Server数据库的操作,就可以使用类似如下的代码。

using(SqlConnection cnn = new SqlConnection(cnnStr))
{
    cnn.Open();
    // 其他数据库操作
}

SqlConnection对象用于连接SQL Server数据库,其中的Open()方法用于打开数据库连接,在using语句结构结束时,SqlConnection对象就可以自动关闭数据库的连接,这样一来,无论数据操作是否成功,都会及时断开连接,从而有效地提高了系统的整体性能。

CHY软件小屋原创作品!