C# 是否需要在finally块中处理数据集
可能重复:C# 是否需要在finally块中处理数据集,c#,dataset,dispose,C#,Dataset,Dispose,可能重复: 我在我的应用程序中使用了一个3层架构,在数据层上我可以简单地获取数据集 Dataset dset= new Dataset(); try { dset = SqlHelper.ExecuteDataset(Con, CommandType.StoredProcedure, "StoredProcedureName", arParms); } catch {} finally { Con.Close(); dset.Dispose() } 处理数据集
我在我的应用程序中使用了一个3层架构,在数据层上我可以简单地获取数据集
Dataset dset= new Dataset();
try
{
dset = SqlHelper.ExecuteDataset(Con, CommandType.StoredProcedure, "StoredProcedureName", arParms);
}
catch
{}
finally
{
Con.Close();
dset.Dispose()
}
处理数据集对象是否对性能有好处?如果对象实现了
IDisposable
,则应将其处理掉
处置任何实现IDisposable
的对象的最佳方法是使用语句将创建内容包装在中:
using(var dset = SqlHelper.ExecuteDataset(Con, CommandType.StoredProcedure,
"StoredProcedureName", arParms))
{
}
以上内容为创建的对象生成正确的处置模式。使用这种模式是一个很好的经验法则——如果你一直这样做,那么忘记处理重要事情的几率就会大大降低
作为Tim Schmelter,我没有讨论性能问题
在数据集的情况下,将不会有性能方面的好处,因为在构造函数中禁止处理,如的答案中所述。同时,调用dispose的开销最小
我建议您针对您的特定用例测试这两种方法,看看哪一种性能更好,以及使用一种方法的好处是否值得缺点。您应该处理并关闭具有IDisposable接口的连接/对象,最有可能的好处是性能,因为您的程序将使用更少的资源和/或更快地释放它们
您可以创建一个新的helper函数,该函数在操作中执行,这样您就不必在每次使用数据集时都考虑清理:
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() ;
}
}
Close()也是如此。如果一个对象实现了Dispose()或Close(),您应该使用它们。@kevin Dispose几乎总是Close的替代品——您几乎不需要同时实现这两种功能。仅供参考:您不需要空的catch块。您最后可以自己尝试一下。但没有回答这个问题,因为您没有提到DataSet
是否实现了它。@TimSchmelter-很公平,答案已更新。只需向同事解释为什么仅仅为了处理数据集而使应用程序设计复杂化是毫无意义的(因为现在你必须使所有拥有数据集成员的东西都是一次性的)他引用了这个答案。数据集禁止终结,并且在其dispose方法中不做任何事情,所以调用dispose没有意义。有时你必须知道何时打破规则。
Helper.UseDataSet( (dataset) =>
{
//use data set here, it will be closed and disposed afterwards
dataset.something
});