#.net #datatable #dispose
#.net #datatable #утилизировать
Вопрос:
У меня есть функция, которая заполняет DataTable
с помощью SqlDataAdapter
// ...
using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command))
try
{
dataAdapter.Fill(dataTable);
}
catch
{
dataTable.Dispose();
dataTable = null;
}
Мне не нравится программирование с культом груза, поэтому я бы предпочел не использовать try
— catch
блок, если в нем нет необходимости. Необходимо ли для Dispose
a DataTable
, который не может быть заполнен?
Комментарии:
1. Какое отношение ваш вопрос имеет к названию вопроса?
2. @Marc B: Извините, я случайно скопировал заголовок из другого вопроса. Мне нравится открывать несколько страниц вопросов StackOverflow, на всякий случай.
3. Отлично, карго-культ громко стучится в дверь. DataTable не реализует Dispose(). Нет смысла, это просто набор байтов. Он наследует его от MarshalByValueComponent. Который делает что-то полуинтересное (не совсем), когда вы использовали конструктор данных, часть «компонент». Если вы этого не сделали, то Dispose() вообще ничего не делает. Конечно, я не могу опубликовать это как ответ.
4. @Hans Passant: Я все равно проголосую за это! 🙂
Ответ №1:
Нет, вызов Dispose
не требуется. Это не приведет к освобождению памяти, которая использовалась для объекта, и GC заберет ее позже, даже если вы не вызовете Dispose
. Подробнее об этом вы можете прочитать здесь.
Комментарии:
1. Потрясающий ответ! Было бы неплохо, если бы документация MSDN содержала эту информацию.
Ответ №2:
Поскольку блок try не удался, вызов Dispose для объекта не требуется
Ответ №3:
Если ваш код создает объект определенного явного конкретного типа, который задокументирован как реализующий IDisposable .Удаление как неоперабельное, тогда можно безопасно обойтись без прямого или косвенного вызова Dispose. Если Dispose действительно ничего не делает, то удаление или не удаление ни на что не повлияет.
С другой стороны, если ваш код использует что-то вроде фабричного метода для создания объекта наследуемого типа, который реализует IDisposable , или если вашему коду присвоено право собственности на такой объект, то вы должны его утилизировать. Даже если вы ожидаете получить объект класса, который не нужно удалять, нет никакого способа быть уверенным, что ваш класс вместо этого не получит производный тип, который действительно нужно удалять. Обратите внимание, что в общем случае вызов Dispose для класса, который реализует IDispsoable.Удаление как неоперабельное будет очень быстрым; часто более эффективно для классов, которым может потребоваться IDisposable, реализовать Dispose как неоперабельный и заставить пользователей класса вызывать Dispose безоговорочно, чем требовать, чтобы пользователь класса проверял, является ли объект IDisposable, и удалял его, если это так.