Почему я должен был бы звонить, располагают на Средствах управления ASP.NET?

Я делаю некоторую разработку ASP.NET в VS и только что нашел интересное небольшое предложение кода (я думаю, что они происходят из coderush, но я мог быть неправым).

Каждый раз, когда я создаю средства управления, это говорит мне, что я должен использовать оператор "использования" для них. Я немного смущен относительно того, что продолжается здесь все же. с использованием моего кода смотрит что-то как:

using (HtmlTableRow tableRow = new HtmlTableRow())
{
    tableRow.Attributes.Add("class", isOddRow ? "OddRow" : "EvenRow");
    listingTable.Rows.Add(tableRow);
    addCell(tableRow, row, "issueId");
    addCell(tableRow, row, "Title");
    addCell(tableRow, row, "Type");
    addCell(tableRow, row, "Summary");
}

Таким образом, я ожидаю, что в конце оператора использования это будет звонить, располагают на tableRow. Однако в документах в библиотеке MSDN говорится:

Расположить метод выходит из-под Контроля в неприменимом состоянии. После вызова этого метода необходимо выпустить все ссылки на управление так память, которую это занимало, может быть исправлен сборкой "мусора".

Таким образом, я ожидал бы, что у меня теперь есть неприменимый объект в моей управляющей структуре, таким образом, она повредила бы или не представила бы или что-то. Однако все, кажется, работает просто великолепно.

Таким образом, то, что я задаюсь вопросом, - то, почему все средства управления доступны? Это просто, потому что некоторые из них будут, и создание их всех доступных означает, что один вызов для расположения на верхнем уровне может затем быть передан ко всем дочерним элементам управления рекурсивно?

Я думаю, что понял бы, если бы не то, что в документах явно говорится, что избавление от управления делает это неприменимым... Документы просто неправильно?

10
задан Chris 30 June 2010 в 15:26
поделиться

1 ответ

На самом деле этого делать не следует. Вам нужно убедиться, что listingTable находится в коллекции Controls, чтобы он был утилизирован при утилизации страницы. Затем объект listingTable отвечает за правильную утилизацию всех своих дочерних элементов.

Именно поэтому все объекты Control реализуют интерфейс IDisposable. Таким образом, каждый родительский элемент управления может вызвать Dispose для всех своих дочерних элементов без необходимости сначала проверять/кастировать каждый из них. Каждый элемент управления индивидуально отвечает за определение того, есть ли у него что-то, что нужно убрать, когда вызывается его метод Dispose.

Документация не ошибается. Любой правильно написанный объект, реализующий IDisposable и имеющий данные состояния, которые фактически очищаются в процессе утилизации , должен выбрасывать ObjectDisposedException, если к любому из его публичных/защищенных/внутренних свойств или методов обращаются после его утилизации. (Предполагается недействительное состояние после вызова Dispose.) Некоторые типы будут игнорировать это правило, если им не нужно ничего убирать, и им не нужно беспокоиться о недействительном состоянии.

Причина, по которой вам предлагают обернуть это в блок using, заключается в том, что анализатор не понимает, что listingTable утилизирует свою коллекцию Rows, которая утилизирует каждый из объектов row, добавленных в нее. Кроме того, если между HtmlTableRow tableRow = new HtmlTableRow() и listingTable.Rows.Add(tableRow) произойдет исключение, объект HtmlTableRow будет "осиротевшим" и не попадет в иерархию IDisposable других объектов. Code Analysis советует использовать блок try/finally, чтобы немедленно утилизировать HtmlTableRow, если это произойдет.

14
ответ дан 3 December 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: