Есть ли причина выбрасывать настольный адаптер? - PullRequest
1 голос
/ 09 февраля 2012

Во многих случаях при работе с различными типами объектов данных важно утилизировать их, чтобы убедиться, что они не оставляют соединение с базой данных открытым. Тем не менее, адаптеры таблиц не кажутся уязвимыми для этой проблемы, потому что они построены по принципу несвязанных данных. У меня сложилось впечатление, что адаптер таблицы всегда будет закрывать соединение после завершения атомарного метода Fill или Update, даже при наличии исключений. Это правильно?

С другой стороны, адаптеры таблиц реализуют IDisposable, поэтому в какой-то момент должны быть некоторые неуправляемые ресурсы для очистки, верно? Или это просто церемония, чтобы люди могли написать:

using(var a = new MyTableTableAdapter())
{
    a.Fill(ds.MyTable);
}

а не надо ли думать об этой теме?

1 Ответ

3 голосов
/ 09 февраля 2012

Если он реализует IDisposable, он либо в настоящее время содержит ресурсы для удаления, либо может в будущем.Если это одноразовый, вы должны утилизировать его.Это не для вас, чтобы понять его внутренности - только чтобы понять его контракт и соблюдать его.Как правило, люди не делают вещи церемонно - «использование» - это крутой синтаксический сахар, но недостаточно крутое, чтобы начать разбрасывать IDisposable вокруг классов, у которых нет ресурсов для распоряжения:)

Кроме того, IDisposable не делаетне обязательно означает "неуправляемые" ресурсы.Это означает, что есть ресурсы (такие как файловые дескрипторы, сетевые подключения и т. Д.), Которые не являются объектами, которые собирают мусор (память).Различие состоит в том, чтобы убирать что-то, что не собрано - не неуправляемо. Просто так получается, что часто многие из этих ресурсов поддерживаются неуправляемыми ресурсами ОС.

РЕДАКТИРОВАТЬ:

Например, допустим, я создал полностью управляемый объект, который получилнекоторые другие объекты из пула (кэша) по требованию, и когда вы закончите использовать его, я хочу, чтобы они помещали эти объекты обратно в общий пул (не освобождали - явный вызов для добавления чего-либо в пул. Ничего неуправляемого здесь, кромеЯ мог бы извлекать объекты из пула по требованию, а при утилизации я мог бы вернуть их (Pool.Add) для использования другими. Вы, потребитель, просто «используете» мой объект и знаете, что он будет очищен при утилизации. Явное удалениенужно, потому что мы не должны ждать завершения (это может случиться намного позже или не наступить вовсе) -

...