4

可能重复:
我应该 Dispose() DataSet 和 DataTable 吗?

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

Dataset dset= new Dataset();

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

处理数据集对象是否有任何性能优势?

4

2 回答 2

4

如果一个对象实现了IDisposable,你应该处理它。

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

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

以上为创建的对象生成了正确的处置模式。使用这种模式是一个很好的经验法则——如果你一直这样做,你忘记处理重要东西的机会就会大大降低。


正如 Tim Schmelter评论的那样,我没有解决性能问题。

在数据集的情况下,将没有性能优势,因为在构造函数中抑制了处置,如对此 SO question的答案中所述。同时,调用 dispose 的开销是最小的。

我建议您针对您的特定用例测试这两种方法,看看哪一种性能更好,以及使用一种方法的好处是否值得缺点。

于 2012-08-13T15:51:43.780 回答
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

 });
于 2012-08-13T16:12:31.650 回答