代码之家  ›  专栏  ›  技术社区  ›  John MacIntyre

为什么父对象不会因先前释放的子对象而失败?

  •  3
  • John MacIntyre  · 技术社区  · 16 年前

    这个问题可能让人难堪,但很明显我遗漏了一些我想/需要知道的东西。

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

    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()是否实际执行深度复制而不仅仅是引用ptr复制?

    TableCell被释放后是否可以实际使用?

    给出了什么?

    1 回复  |  直到 16 年前
        1
  •  6
  •   David    16 年前

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

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

    因为您希望在将来使用这些对象,所以根本不应该将它们放在“使用”块中。父页对象应在页生命周期结束时释放控件。

    编辑: 我做了一个测试服务器控件,并在它的“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)
    
    推荐文章