2012-07-03 5 views
1

Итак, я занимаюсь существующим проектом, где предыдущий кодер сделал много забавных вещей.в порядке ли вы располагать набор данных в блоке finally и затем возвращать набор данных?

Что я вижу больше всего, и на самом деле не понимают, следующий блок кода

finally 
{ 
    if (conn != null) 
    { 
     conn.Close(); 
     ds.Dispose(); 
    } 
} 
return ds; 

VS2010 не жалуясь, а проект работает по назначению, однако это Bizzare мне.

Как его можно утилизировать, а затем возвращать? если, наконец, не произойдет после возвращения?

Если кто-то может объяснить, почему это является законным? или любое другое объяснение будет оценено по достоинству.

+0

Является ли он распоряжаться разъемом дальше и, следовательно, conn == null? – ChrisBint

+0

Вы должны пройти через эту тему http://stackoverflow.com/questions/2940629/this-dispose-dont-release-memory-used-by-form-after-closing-it – Habib

ответ

3

Неправильно удаляйте ds, прежде чем удалять его с method, так как вы потеряете информацию в наборе данных. Устранение соединения в блоке finally выглядит отлично, но не набор данных ds, который еще должен быть возвращен вызывающему методу.

0

Как что кажется Д.С. расположен, когда он возвращается, это дает вам какие-либо ошибки при выполнении кода, если так реорганизовать этот код, // и комментировать ds.Dispose

+1

Я предполагаю, что кодер был сбит с толку, и он хотел распоряжаться связью – JohnnBlade

1

Вы должны .Dispose(), когда они вам больше не нужны. Очевидно, что вам нужен DataSet после того, как вы разместили его в этом примере, поэтому вы не должны его полностью уничтожать.

.Dispose() в DataSet на самом деле ничего не может сделать, поэтому код работает. Помните, что .Dispose() предназначен для закрытия и завершения использования ресурсов, которые сборщик мусора не может сделать, или для того, чтобы немедленно распоряжаться такими ресурсами, а не когда собирает сборщик мусора. Но вы не должны полагаться .Dispose () в DataSet ничего не делает - могут быть обстоятельства, при которых он что-то делает. Исправьте код.

0

Когда вы вызываете функцию Dispose(), вы просто помещаете объект в сборку мусора, вы не сразу «освобождаете/уничтожаете» объект. Вот почему код работает. Если эта логика не имеет никакого смысла, вы всегда можете сделать что-то вроде этого:

try{ 
    // ... your code 
    return ds; 
} 
catch(Exception x) 
{ 
    // ... Exception code 
} 
finally 
{ 
    if (conn != null) 
    { 
     conn.Close(); 
     ds.Dispose(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^