对象不沿所有执行路径布置

Bra*_*rad 6 c# c#-4.0

我有以下代码.

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Microsoft Code Analysis告诉我dt没有沿着所有执行路径处理,但我不知道如何纠正这个问题.如果我尝试dispose在之前调用它return,它将返回一个空值,如果我尝试在方法结束时执行它,代码永远不会到达...

我在这里错过了什么?

这是来自分析工具的消息:

警告:CA2000:Microsoft.Reliability:在方法'xx()'中,对象'dt'不会沿所有异常路径放置.对所有对它的引用超出范围之前,在对象'dt'上调用System.IDisposable.Dispose.

juh*_*arr 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个想法是,如果发生异常,那么就没有办法处理DataTable它,因为它不会被传递回调用者.因此,这是使代码分析愉快的模式.

  • 为什么不为DataTable使用using语句呢? (3认同)
  • @ Selman22因为该方法返回`DataTable`. (2认同)
  • @ Selman22:因为你只想在异常情况下处理它,而不是总是如此. (2认同)