Как я могу распоряжаться набором данных при передаче в качестве аргумента
Я получаю ошибку анализа кода из-за того, что не избавился от набора данных. Это возникает, когда я передал 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
вместо бессмысленного перемещения вещей?