Как я могу распоряжаться набором данных при передаче в качестве аргумента

Я получаю ошибку анализа кода из-за того, что не избавился от набора данных. Это возникает, когда я передал 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;
        }

3 ответа

Решение

Как правило, вы можете игнорировать ошибку, которая указывает на то, что вы должны DataSet, DataSet инвентарь IDisposable (как и DataTable), но он не содержит никаких неуправляемых ресурсов: Должен ли я Dispose() DataSet и 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;
}

Вы не должны распоряжаться вещами, которые вы возвращаете, и в большинстве случаев вы не должны распоряжаться вещами, которые кто-то передает вам, чтобы посмотреть (единственный раз, когда вы будете распоряжаться им, это если контракт метода давал понять, что этот метод был ответственность за уборку). Честно говоря, я не думаю, что есть какая-то причина для избавления от двух показанных методов. Более правильная реализация была бы просто:

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))
{
    // ...
}

Это предупреждение не самое страшное. Вы распоряжаетесь своим DataSet в вашем Test2 метод. Зачем ты это делаешь? Это сделает DataSet бесполезный. Даже возвращать его бесполезно, особенно если это тот же экземпляр, что и в.

Почему бы не позволить Test2 создать и вернуть новый DataSet вместо бессмысленного перемещения вещей?

Другие вопросы по тегам