昨天和同事无意中提及到关于using释放资源的问题,在此抛砖引玉一下。微软的官方定义是,Using定义一个范围,将在此范围之外释放一个或多个对象。以下是代码示例:
using (Font font1 = new Font("Arial", 10.0f)) {
}
示例.1
using System; class C : IDisposable { public void UseLimitedResource() { Console.WriteLine("Using limited resource..."); } void IDisposable.Dispose() { Console.WriteLine("Disposing limited resource."); } } class Program { static void Main() { using (C c = new C()) { c.UseLimitedResource(); } Console.WriteLine("Now outside using statement."); Console.ReadLine(); } }
示例.2
我一般不建议使用using来释放对象,它的主要缺点是:
- using不能替代try catch语句,如果要防止对象生成出现的异常,要整个using块进行异常监测,花费代价很高;
- using的对象必须继承IDisposable接口,继承改接的对象在生成会比一般对象花费更大的开销和时间;
- 使用using除了能使代码更好看以外,找不出更好的使用理由。
我认为它的唯一优点就是:不会忘记释放资源!但是,除非诸如文件句柄和网络连接这样的有限资源外,不是每个对象都需要我们手动立刻释放资源,绝大多数可以交给垃圾处理器去自动处理。
示例.1中using代码显得很多余,因为font1根本不需要我们手工释放,它并没有消耗大量的内存资源需要们即时释放。示例.2中由于对象C继承了IDisposable接口,生成消耗更多的内存和时间,所以如果没有必要的话,尽量不要继承IDisposable接口。