是否有必要在 finally 块中处理数据集 [重复]
Posted
技术标签:
【中文标题】是否有必要在 finally 块中处理数据集 [重复]【英文标题】:is it necessary to dispose dataset in finally block [duplicate] 【发布时间】:2012-08-09 21:18:36 【问题描述】:可能重复: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()
处置数据集对象有什么性能优势吗?
【问题讨论】:
Close() 也是如此。如果一个对象实现了 Dispose() 或 Close() 你应该使用它们。 @kevin Dispose 几乎总是 Close 的替代品——你几乎不需要同时做这两个。 仅供参考:您不需要空的 catch 块。你可以自己试一试。 【参考方案1】:您应该处置和关闭具有 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
);
【讨论】:
【参考方案2】:如果一个对象实现了IDisposable
,你应该丢弃它。
处置任何实现IDisposable
的对象的最佳方法是将创建包装在using
语句中:
using(var dset = SqlHelper.ExecuteDataset(Con, CommandType.StoredProcedure,
"StoredProcedureName", arParms))
上面为创建的对象生成了正确的处置模式。使用这种模式是一个很好的经验法则 - 如果你一直这样做,你忘记处理重要东西的机会就会大大降低。
作为 Tim Schmelter commented,我没有解决性能问题。
在数据集的情况下,不会有性能优势,因为在构造函数中抑制了处置,如this SO question 的答案中所述。同时调用 dispose 的开销也很小。
我建议您针对您的特定用例测试这两种方法,看看哪一种表现更好,以及使用一种方法的好处是否值得缺点。
【讨论】:
虽然没有回答这个问题,因为你没有提到DataSet
是否实现它。
@TimSchmelter - 很公平,答案已更新。
只需要向一位同事解释为什么仅仅为了处理数据集而使您的应用程序设计复杂化绝对没有意义(因为现在您必须让所有具有数据集成员的东西都可以自行处理),他参考了这个答案。数据集抑制终结,并且在它们的 dispose 方法中什么都不做,所以调用 dispose 是没有意义的。有时你必须知道什么时候打破规则。以上是关于是否有必要在 finally 块中处理数据集 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Java面试题22 JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?