是否有必要在finally块中处理数据集

时间:2012-08-13 15:47:34

标签: c# dataset dispose

  

可能重复:
  Should I Dispose() DataSet and DataTable?

我在我的应用程序中使用3层架构,在Datalayer上我很简单地获取数据集

Dataset dset= new Dataset();

try 
{
    dset = SqlHelper.ExecuteDataset(Con, CommandType.StoredProcedure, "StoredProcedureName", arParms);
}
catch 
{}
finally 
{
    Con.Close();
    dset.Dispose()
}

处理数据集对象有什么性能优势吗?

2 个答案:

答案 0 :(得分:4)

如果某个对象实现了IDisposable,则应该将其丢弃。

处理实现IDisposable的任何对象的最佳方法是将创建包装在using语句中:

using(var dset = SqlHelper.ExecuteDataset(Con, CommandType.StoredProcedure, 
                                                 "StoredProcedureName", arParms))
{
}

以上为创建的对象生成正确的处理模式。使用这种模式是一个很好的经验法则 - 如果你一直这样做,那么你忘记处理重要事物的可能性就会大大降低。


正如Tim Schmelter commented,我没有解决绩效问题。

对于数据集,没有性能优势,因为在构造函数中抑制了处理,如this SO question的答案中所述。与此同时,调用dispose的开销很小。

我建议您针对特定用例测试这两种方法,看看哪种方法表现更好,以及使用一种方案优于另一种方案的好处是否值得减少。

答案 1 :(得分:0)

你应该处理和关闭具有IDisposable接口的连接/对象,因为你的程序将使用更少的资源和/或更快地释放它们,所以在性能上有很大的好处。

您可以创建一个新的辅助函数来执行操作,这样您每次使用数据集时都不必考虑清理:

        public static void UseDataSet(Action<Dataset> code)
        {
            ...

            Dataset dset= new Dataset(); 

            try  
            { 
                dset = SqlHelper.ExecuteDataset(Con, CommandType.StoredProcedure, "StoredProcedureName", arParms); 
                code(dset);
            } 
            catch  
            {  } 
            finally  
            { 
               Con.Close(); 
               dset.Dispose() ;
            } 
        }

使用该功能:

 Helper.UseDataSet( (dataset) =>
 {
    //use data set here, it will be closed and disposed afterwards
    dataset.something

 });