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