using语句在.NET中常用来释放实现System.IDisposable接口的类的实例的资源。但是如果在using语句中出现异常,该资源是否能够被正确释放?
以下通过代码来证明:
namespace UsingDemo
{
public partial class MainForm : Form
{
public MainForm() { InitializeComponent(); }
private void test() {
using (var ss = new UsingTest()) {
ss.Start();
throw new Exception("test");
}
}
void Button2Click(object sender, EventArgs e) {
// 调用着没有被try...catch包含
this.test();
}
}
public class UsingTest:IDisposable
{
public void Start() {
MessageBox.Show("启动");
}
public void Dispose() {
MessageBox.Show("异常处理");
}
}
}
测试结果:显示【启动】>> 程序奔溃
namespace UsingDemo
{
public partial class MainForm : Form
{
public MainForm() { InitializeComponent(); }
private void test() {
using (var ss = new UsingTest()) {
ss.Start();
throw new Exception("test");
}
}
void Button2Click(object sender, EventArgs e) {
try {
this.test();
}
catch (Exception ex){
MessageBox.Show(ex.Message);
}
}
}
public class UsingTest:IDisposable
{
public void Start() {
MessageBox.Show("启动");
}
public void Dispose() {
MessageBox.Show("异常处理");
}
}
}
测试结果:显示【启动】>> 【异常处理】>> 【test】
结论:调用这使用try...catch时,using语句内的资源能够被正确释放。但如果未使用try...catch,程序直接奔溃,资源不会被释放。