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

时间:2014-11-14 16:32:43

标签: 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;
        }
    }
}

Microsoft Code Analysis告诉我dt并未在所有执行路径中处理,但我不确定如何更正此问题。如果我尝试在dispose之前调用return,它将返回一个空值,如果我尝试在方法结束时执行它,则永远不会达到代码... < / p>

我在这里缺少什么?

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

  

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

4 个答案:

答案 0 :(得分: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,因为它不会被传递回调用者。因此,这是使代码分析更快乐的模式。

答案 1 :(得分:3)

解雇工具。 DataTables不需要处理。它们是IDisposable因为它们继承了IComponent,但它们的Dispose()方法什么都不做。我发现MS自己的工具不知道这一点令人厌恶。

答案 2 :(得分:0)

代码分析警告您此对象可能无法处理。正如@juharr正确建议的那样,你应该中和发生异常的代码路径,否则对象将不会被返回并且不会被明确处理掉。这将消除警告。

答案 3 :(得分:-2)

检查@juharr答案,以及使用Datatable之后,你不再需要它了

using(dt){}

它会为你配置