潜在的令人尴尬的问题,但显然我想要/需要知道的事情。
我希望以下代码创建一个新表格行,其中包含稍后要渲染的新单元格。而这正是它所做的......正如你所期望的那样。
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是否会失效?此行引用的TD对象现在是否无效,并且在尝试使用它时该行是否应该失败?当TR由'tbl'对象渲染时,TR也可以这样说。
我不明白处置?
我不明白使用?
TableRow.Cells.Add()实际上是在做一个深层复制而不仅仅是一个ref ptr复制吗?
TableCell实际上可以在它被处理后使用吗?
是什么给出了?
答案 0 :(得分:6)
所有“using”块都确保在块结束时调用对象的“Dispose”方法。在处理对象之后仍然可以使用对象,但是由它们实现“Dispose”方法来确定如果这样做会发生什么坏事。
在这种情况下,它看起来不像TableRow&的“Dispose”方法。 TableCell可以阻止将来使用它们。这就是你没有任何问题的原因。
由于您确实希望将来使用这些对象,因此您不应将它们置于“使用”块中。父页面对象应该在页面生命周期结束时处理控件。
修改强> 我做了一个测试服务器控件并在其“Dispose”事件中放置了一个断点。这是显示.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)