.net 为什么';t父对象与以前处理的子对象一起失败?

.net 为什么';t父对象与以前处理的子对象一起失败?,.net,dispose,using,.net,Dispose,Using,这可能是一个令人尴尬的问题,但很明显,我遗漏了一些我想/需要知道的事情 我希望下面的代码创建一个新的表行,并在以后呈现新的单元格。这就是它所做的。。。如你所料 using (TableRow tr = new TableRow()) { using (TableCell td = new TableCell()) { td.Text = "Column A"; tr.Cells.Add(td); } using (TableCell

这可能是一个令人尴尬的问题,但很明显,我遗漏了一些我想/需要知道的事情

我希望下面的代码创建一个新的表行,并在以后呈现新的单元格。这就是它所做的。。。如你所料

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);
}
但是。。。。但是,在using语句中创建的TDs一旦超出“using”范围,不是就失效了吗?行引用的TD对象现在不是无效的吗?行尝试使用它们时不应该失败吗?当TR由“tbl”对象渲染时,也可以这样说

我不明白吗

我不懂使用吗

TableRow.Cells.Add()实际上是在做深度拷贝,而不仅仅是ref-ptr拷贝吗

TableCell在处理后是否可以实际使用

给出了什么?

所有“使用”块所做的就是确保在块的末尾调用对象的“Dispose”方法。对象在被释放后仍然可以被访问,但这取决于它们的“Dispose”方法的实现,以了解如果这样做是否会发生任何不好的事情

在这种情况下,TableRow和TableCell上的“Dispose”方法看起来并不会阻止将来使用它们。这就是为什么你没有任何问题

由于您确实希望将来使用这些对象,因此根本不应该将它们放在“使用”块中。父页面对象应在页面生命周期结束时处置这些控件

编辑: 我创建了一个测试服务器控件,并在其“Dispose”事件中放置了一个断点。下面是显示.Net为您调用dispose的堆栈跟踪。您可以使用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)

谢谢大卫,老实说,我想不出有什么理由这些东西是一次性的。就不处理它们而言,假设父对象总是处理一次性对象是否安全?我不太确定我对此有多满意。页面将在呈现后处理控件。页面对象是否处理所有控件?有人对此有联系吗?因此,页面对象将处理所有控件。查看我添加到我的答案中的堆栈跟踪。