Почему родительский объект не завершается с ранее удаленным дочерним объектом? - PullRequest
3 голосов
/ 31 августа 2009

Потенциально неловкий вопрос, но мне явно чего-то не хватает, что я хочу / должен знать.

Я ожидаю, что следующий код создаст новую строку таблицы с новыми ячейками, которые будут отображаться позже. И это то, что он делает ... как и следовало ожидать.

using (TableRow tr = new TableRow())
{
    using (TableCell td = new TableCell())
    {
        td.Text = "Column A";
        tr.Cells.Add(td);
    }
    using (TableCell td = new TableCell())
    {
        td.Text = "Column B";
        tr.Cells.Add(td);
    }
    tbl.Rows.Add(tr);
}

Но .... но разве TD, созданные в операторах using, не становятся недействительными после того, как они выходят из области использования? Разве объекты TD, на которые ссылается строка, теперь не будут недействительными, и не должна ли строка потерпеть неудачу при попытке их использования? То же самое можно сказать и о TR, когда он отображается объектом 'tbl'.

Разве я не понимаю распоряжаться?

Разве я не понимаю, используя?

Действительно ли TableRow.Cells.Add () делает глубокую копию, а не просто контрольную копию?

Можно ли использовать TableCell после его утилизации?

Что дает?

1 Ответ

6 голосов
/ 31 августа 2009

Все, что делает блок «using», это гарантирует, что метод «Dispose» объекта вызывается в конце блока. Доступ к объектам по-прежнему можно получить после их удаления, но их реализация метода Dispose зависит от того, произойдет ли что-нибудь плохое, если это будет сделано.

В этом случае не похоже, чтобы метод «Dispose» в TableRow & TableCell делал что-либо, что препятствует их использованию в будущем. Вот почему у вас нет проблем.

Поскольку вы хотите, чтобы объекты использовались в будущем, вам вообще не следует помещать их в блоки "using". Родительский объект страницы должен располагать элементами управления в конце жизненного цикла страницы.

Edit: Я сделал тестовый серверный элемент управления и поместил точку останова в событие «Утилизация». Вот трассировка стека, которая показывает, что .Net вызывает удаление для вас. Вы можете использовать Reflector, чтобы посмотреть на код более подробно.

at TestControl.Dispose() in D:\TestControl.cs:line 25  
at System.Web.UI.Control.UnloadRecursive(Boolean dispose)   
at System.Web.UI.Control.UnloadRecursive(Boolean dispose)   
at System.Web.UI.Control.UnloadRecursive(Boolean dispose)  
at System.Web.UI.Control.UnloadRecursive(Boolean dispose) 
at System.Web.UI.Page.UnloadRecursive(Boolean dispose)  
at System.Web.UI.Page.ProcessRequestCleanup()   
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)   
at System.Web.UI.Page.ProcessRequest()   
at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)   
at System.Web.UI.Page.ProcessRequest(HttpContext context)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...