c# – 对象未沿所有执行路径布置

我有以下代码.
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,它将返回一个null值,如果我尝试在方法结束时执行它,则代码永远不会到达…

在这里错过了什么?

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

warning : CA2000 : Microsoft.Reliability : In method ‘x.x()’,object
‘dt’ is not disposed along all exception paths. Call
System.Idisposable.dispose on object ‘dt’ before all references to it
are out of scope.

解决方法

发生异常时需要处理它.像这样.
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,因为它不会被传递回调用者.因此,这是使代码分析愉快的模式.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...