之前使用using语句一直都有一个疑问就是,如果using语句中出现了异常,那么using的对象会被释放掉吗?比较常见的作法是在using里面写try...catch...finally释放资源。今天就做个实验来看看资源是否会释放掉。
1. 创建一个连接类,并实现IDisposable接口
public class MyConnection : IDisposable
{
public void Open()
{
Console.WriteLine("MyConnection打开连接");
}
public void Dispose()
{
Console.WriteLine("MyConnection已被释放");
}
}
2. 创建一个命令类,调用MyConnection
public class MyCommand
{
public void Fun1()
{
using (MyConnection conn = new MyConnection())
{
conn.Open();
throw new Exception("");
}
}
}
3. 执行命令
static void Main(string[] args)
{
try
{
MyCommand command = new MyCommand();
command.Fun1();
}
catch
{
}
Console.Read();
}
输出如下:
可以得出结论,即使在using内部抛出了异常被using的对象还是会被释放掉的
后来我在《CLR Via C#》第三版的21章发现有这么一段话:
原来在编译阶段using内部就会自动生成try...finally块,哈哈。