2009-08-31 78 views
3

潛在的令人尷尬的問題,但顯然有一些我錯過了,我想/需要知道。爲什麼父對象不能以先前處理的子對象失敗?

我期望下面的代碼創建一個新的表格行,其中新的單元格稍後將被渲染。正如你所期望的那樣,它就是這樣做的。

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()實際上是做一個深層副本,而不僅僅是一個參考副本?

TableCell實際上可以在丟棄後使用嗎?

什麼給?

回答

6

所有的「使用」塊都會確保在塊的末尾調用該對象的「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) 
+0

感謝大衛,說實話,我想不出任何理由,這些物體甚至是一次性的。至於不處理它們,假設父對象總是處理一次性對象是安全的嗎?我不確定我有多舒服。 – 2009-08-31 17:00:51

+0

頁面將在渲染後處理控件。 – 2009-08-31 17:49:25

+0

Page對象是否處理所有控件?有人有鏈接嗎? thx – 2009-08-31 18:13:54

相關問題