C# 当作为参数传递时,如何处理数据集

C# 当作为参数传递时,如何处理数据集,c#,code-analysis,C#,Code Analysis,我因未处理数据集而收到代码分析错误。当我将DataSet作为参数传递给方法Test2时,就会出现这种情况。 当我评论对Test2()的调用时,此错误被删除。 所以请帮我解决这个错误 static DataSet TestMethod(DataSet s) { try { try { if (s != nu

我因未处理数据集而收到代码分析错误。当我将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
实现了
IDisposable
(也像
DataTable
),但它不包含任何非托管资源:

但是,为什么要将
数据集
作为参数传递给该方法呢?为什么用这个
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;
}

通常,您可以忽略一个错误,该错误指示您应该处理
数据集。
DataSet
实现了
IDisposable
(也像
DataTable
),但它不包含任何非托管资源:

但是,为什么要将
数据集
作为参数传递给该方法呢?为什么用这个
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
。你为什么这么做?这将使
数据集
无用。即使返回它也是无用的,尤其是当它与放入的实例相同时


为什么不让
Test2
创建并返回一个新的
数据集
,而不是毫无意义地四处移动呢?

这个警告并不是最糟糕的。您可以在
Test2
方法中处理
DataSet
。你为什么这么做?这将使
数据集
无用。即使返回它也是无用的,尤其是当它与放入的实例相同时


为什么不让
Test2
创建并返回一个新的
数据集
,而不是毫无意义地移动东西呢?

你不应该处理你正在返回的东西,而且在大多数情况下,你不应该处理别人交给你看的东西(只有在方法合同明确该方法负责清理的情况下,您才会处理它)。坦率地说,我认为在所示的两种方法中根本没有理由处理。更正确的实现方法是:

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
}
您会注意到完全缺乏处理;在有人传入一个现有的
数据集
的场景中,他们仍然希望它工作。在有人传入
null
的场景中,好吧-由于我们将新的数据集交还给他们,因此,处理它仍然毫无意义

如果调用方希望处理对象(在本例中这并不重要),这就是他们的工作:

或者可能是更奇特的建筑场景:

using(var rs = TestMethod(null))
{
    // ...
}

你不应该处理你要归还的东西,而且在大多数情况下,你不应该处理别人交给你看的东西(只有在方法合同明确规定该方法负责清理的情况下,你才会处理)。坦率地说,我认为根本没有理由在所示的两种方法中处理更正确的实现方法是:

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
}
您会注意到完全缺乏处理;在有人传入一个现有的
数据集
的场景中,他们仍然希望它工作。在有人传入
null
的场景中,好吧-由于我们将新的数据集交还给他们,因此,处理它仍然毫无意义

如果调用方希望处理对象(在本例中这并不重要),这就是他们的工作:

或者可能是更奇特的建筑场景:

using(var rs = TestMethod(null))
{
    // ...
}

实际上,这个错误是代码严重损坏的一个症状。为什么要处理在Test2中返回的资源?为什么还要返回输入参数?为什么要在第一个方法中覆盖输入参数变量?您应该重构代码,使其不易出错,并且对其他程序员来说更明显(因为这包括你自己2个月的时间)。代码中没有任何内容表明“
TestMethod
假设拥有此对象的生命周期”-事实上,因为它返回了它,正好相反;坦白地说,我认为在这里处理任何东西都是错误的(这并不重要,因为
DataSet
)顺便说一句,
catch
仅仅抛出
throw
是毫无意义的。删除它。实际上,错误是代码严重损坏的症状。为什么要处理在Test2中返回的资源?为什么还要返回输入参数?为什么要在第一个方法中覆盖输入参数变量?应该重构它代码不太容易出错,并且对其他程序员来说更明显(因为这包括你自己2个月的时间)。代码中没有任何内容表明“
TestMethod
假设拥有此对象的生命周期”-事实上,由于它返回它,正好相反;坦率地说,我认为在这里处理任何东西都是错误的(对于
数据集
,这并不重要)顺便说一句,
catch
仅仅抛出
是毫无意义的。删除它。处理
数据集的无用性是一个很好的观点。知道他们为什么让
DataSet
实现
IDisposable
吗?
IDisposable
来自继承的
MarshalByValueComponent
,它启用了可视数据VisualStudio中的rag&drop功能。目前,在那些