C# · 12月 27, 2021

c# – 使用语句嵌套 – 哪一个不会被处理掉

如果我有这样的代码并且在第二个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