Ответ 1
Вы не должны этого делать. Что вам нужно сделать, так это убедиться, что listTable находится в коллекции Controls
, чтобы он был удален при размещении страницы. Объект listingTable затем отвечает за правильное удаление всех его дочерних элементов.
Вот почему все объекты Control
реализуют интерфейс IDisposable. Таким образом, каждый родительский элемент управления может вызывать Dispose
для всех своих дочерних элементов без предварительного тестирования/броска каждого из них. Каждый элемент управления индивидуально отвечает за определение того, имеет ли он на самом деле что-нибудь, что нужно очистить, когда вызывается его метод Dispose
.
Документы не ошибаются. Любой правильно написанный объект, который реализует IDisposable и имеет данные состояния, которые фактически очищены во время процесса dispose, должен вызывать ObjectDisposedException, если к нему будут доступны какие-либо из его общедоступных/защищенных/внутренних свойств или методов после его удаления. (Предположите недопустимое состояние после того, как был вызван Dispose
.) Некоторые типы игнорируют это правило, если на самом деле у них нет ничего для очистки, и не нужно беспокоиться о недопустимом состоянии.
Причина, по которой вы получаете предложение обернуть ее в блок using
, состоит в том, что анализатор не понимает, что listingTable
будет распоряжаться своей коллекцией Rows
, которая будет располагать каждый из объектов строки, которые имеют был добавлен к нему. Кроме того, если исключение выбрано между HtmlTableRow tableRow = new HtmlTableRow()
и listingTable.Rows.Add(tableRow)
, объект HtmlTableRow будет "потерян" и не будет находиться в какой-либо другой иерархии объектов IDisposable
. Анализ кода требует, чтобы вы использовали блок try/finally для немедленного удаления HtmlTableRow
, если это произойдет.