我有以下代码.
private DataTable LoadSMSCellProviders() { string sqlQuery = "Select * from SMSAddress"; DataTable dt = new DataTable(); using (SqlConnection conn = new SqlConnection(Utility.ConnString)) { using (SqlCommand command = new SqlCommand(sqlQuery, conn)) { SqlDataAdapter adapter = new SqlDataAdapter(command); adapter.Fill(dt); return dt; } } }
Microsoft Code Analysis告诉我dt
没有沿着所有执行路径处理,但我不知道如何纠正这个问题.如果我尝试dispose
在之前调用它return
,它将返回一个空值,如果我尝试在方法结束时执行它,代码永远不会到达...
我在这里错过了什么?
这是来自分析工具的消息:
警告:CA2000:Microsoft.Reliability:在方法'xx()'中,对象'dt'不会沿所有异常路径放置.对所有对它的引用超出范围之前,在对象'dt'上调用System.IDisposable.Dispose.
juharr.. 7
发生异常时需要处理它.像这样.
private DataTable LoadSMSCellProviders() { string sqlQuery = "Select * from SMSAddress"; DataTable dt = null; try { dt = new DataTable(); using (SqlConnection conn = new SqlConnection(Utility.ConnString)) { using (SqlCommand command = new SqlCommand(sqlQuery, conn)) { SqlDataAdapter adapter = new SqlDataAdapter(command); adapter.Fill(dt); return dt; } } } catch { if(dt != null) dt.Dispose(); throw; } }
这个想法是,如果发生异常,那么就没有办法处理DataTable
它,因为它不会被传递回调用者.因此,这是使代码分析愉快的模式.