我没有处理数据集的代码分析错误。当我将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;
}
答案 0 :(得分:2)
通常,您可以忽略指示您应该处置DataSet
的错误。 DataSet
实施IDisposable
(与DataTable
一样),但它不包含任何非托管资源:Should I Dispose() DataSet and DataTable?
但是,为什么要将DataSet
作为参数传递给方法呢?为什么用Test2
作为参数调用DataSet
?为什么在尝试从该方法返回之前将其丢弃?
说实话,代码完全被破坏而且毫无意义。
通常你需要一种方法,如下所示:
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;
}
答案 1 :(得分:1)
这个警告并不是最糟糕的。您在DataSet
方法中处置了Test2
。你为什么那样做?它会使DataSet
无用。即使返回它也是无用的,特别是当它与放入的实例相同时。
为什么不让Test2
创建并返回新的DataSet
而不是无意义地移动东西?
答案 2 :(得分:1)
你不应该处理你要归还的东西,并且在大多数情况下,你不应该处置某人传递给你的东西(你唯一会这样做)如果方法合同明确表明此方法负责清理,则处理它。坦率地说,我认为没有理由在所示的两种方法中处理完全。更正确的实现将是:
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))
{
// ...
}