Joh*_*yre 3 .net dispose using
可能令人尴尬的问题,但显然有一些我想要/需要知道的东西.
我希望以下代码创建一个新的表行,其中包含稍后要呈现的新单元格.而这就是它所做的......正如你所期望的那样.
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);
}
Run Code Online (Sandbox Code Playgroud)
但....但是,一旦它们走出'使用'范围,使用语句中创建的TD是否会失效?此行引用的TD对象现在是否无效,并且在尝试使用它时该行是否应该失败?TR由'tbl'对象渲染时也可以这样说.
我不明白处置?
我不明白使用?
TableRow.Cells.Add()实际上是在做一个深层复制而不仅仅是一个ref ptr复制吗?
TableCell实际上可以在它被处理后使用吗?
是什么赋予了?
所有"使用"块都确保在块的末尾调用对象的"Dispose"方法.对象仍然可以在它们被处理后被访问使用,但是由它们实现"Dispose"方法来知道如果这样做会发生什么坏事.
在这种情况下,它看起来不像TableRow和TableCell上的"Dispose"方法做任何阻止它们在将来使用的东西.这就是你没有任何问题的原因.
由于您确实希望将来使用这些对象,因此您不应将它们置于"使用"块中.父页面对象应该在页面生命周期结束时处理控件.
编辑: 我做了一个测试服务器控件并在其"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)
Run Code Online (Sandbox Code Playgroud)