如果我有这样的代码并且在第二个using语句中发生错误,那么第一次使用的dispose方法是否会被调用?
using (System.Data.sqlClient.sqlConnection cn = new System.Data.sqlClient.sqlConnection(cnstr)) { cn.Open(); using (sqlTransaction tran = cn.BeginTransaction(IsolationLevel.Serializable)) {
– 编辑 –
编写Try / Finally块或使用语句也更好.内部compilter将生成Try / Finally for using语句但是根据编码标准哪个更好?
解决方法
不,两者都会被召集.仅仅因为在内部语句中调用异常,并不意味着忽略第一个异常.
using语句只是另一种语法:
var iDisposableItem = new Item(); try { ...... } finally { iDisposableItem.Dispose(); }
所以在你的例子中:
var iDisposableItem = new Item(); try { var iDisposableItem2 = new Item(); try { throws exception } finally { iDisposableItem2 .Dispose(); } } finally { iDisposableItem.Dispose(); }
现在应该注意的是,你需要注意的是,无论是什么导致第一个异常都会在调用Dispose()时导致外部using语句出现问题.异常可能会将(实际上)任何对象抛入故障状态,并且调用Dispose可能会导致另一个异常“掩盖”第一个异常.使用using语句时,这是WFC中的问题:http://msdn.microsoft.com/en-us/library/aa355056.aspx