当作为参数传递时,我如何处置数据集
本文关键字:何处置 数据集 参数传递 | 更新日期: 2023-09-27 18:19:00
我得到代码分析错误不处理数据集。当我将DataSet作为参数传递给方法Test2时,就会出现这种情况。当我评论调用Test2()时,这个错误被删除了。所以请帮我解决这个错误。
static DataSet TestMethod(DataSet s)
{
try
{
try
{
if (s != null)
{
s = new DataSet();
//some other stuff....
}
**s = Test2(s);** //This line causes Dispose code analysis error
}
catch (InvalidCastException)
{
throw;
}
return s;
}
catch (Exception)
{
throw;
}
finally
{
if (s!=null)
{
s.Dispose();
}
}
}
static DataSet Test2(DataSet s)
{
try
{
//some stuff
}
catch (InvalidCastException)
{
}
finally
{
s.Dispose();
}
return s;
}
一般情况下,您可以忽略指示您应该处理DataSet
的错误。DataSet
实现IDisposable
(也像DataTable
),但它不持有任何非托管资源:我应该处置()数据集和数据表吗?
但是,为什么要将DataSet
作为参数传递给方法呢?为什么用DataSet
作为参数调用Test2
呢?为什么在你尝试从那个方法返回它之前你要把它处理掉?
老实说,这段代码完全被破坏了,毫无意义。
通常需要如下方法:
static DataSet TestMethod()
{
DataSet ds = new DataSet();
using(var con = new SqlConnection("Connection-String"))
using(var da = new SqlDataAdapter("SELECT t.* FROM TableName t ORDER BY t.Column", con))
da.Fill(ds);
return ds;
}
这个警告还不是最糟糕的。在Test2
方法中处理DataSet
。你为什么这么做?这将使DataSet
无用。甚至返回它也是无用的,特别是当它与输入的是同一个实例时。
为什么不让Test2
创建并返回一个新的DataSet
,而不是毫无意义地移动东西?
你不应该处理你返回的东西,而且在大多数情况下,你不应该处理别人传递给你看的东西(你唯一会处理它的时候是如果方法契约明确表明这个方法负责清理)。坦率地说,我认为根本没有理由在上述两个方法中处理。更正确的实现是:
static DataSet TestMethod(DataSet s)
{
if (s == null) // I'm assuming this was a typo, otherwise the
// input is completely ignored
{
s = new DataSet();
//some other stuff....
}
Test2(s); // note you didn't handle the return value, so it
// can't be important or relevent
return s; // in case we just created it
}
static void Test2(DataSet s)
{
//some stuff
}
你会注意到完全没有处理;在有人传入现有DataSet
的情况下,他们仍然希望它工作。在有人传入null
的情况下,由于我们将新的作为结果返回给他们,因此处理它仍然没有意义。
如果调用者想要处理对象(在这种情况下无关紧要),那就是他们的工作:
using(var ds = ...)
{
// ...
TestMethod(ds);
// ...
}
或者更奇特的构造场景:
using(var rs = TestMethod(null))
{
// ...
}