当作为参数传递时,我如何处置数据集

本文关键字:何处置 数据集 参数传递 | 更新日期: 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))
{
    // ...
}