2009-08-31 7 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); 
} 

しかし....しかし、彼らは「を使用して」スコープの外に出たら無効usingステートメントで作成されたTDではありませんか?行で参照されるTDオブジェクトが無効になることはなく、行を使用しようとするとその行が失敗しないはずですか? TRが 'tbl'オブジェクトによってレンダリングされたときにもTRと同じことが言えます。

処分は分かりませんか?

使用しているとわかりませんか?

TableRow.Cells.Add()は実際には深いコピーをref ptrコピーだけではないのですか?

TableCellは実際に処分された後に使用できますか?

何がありますか?

答えて

6

"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) 
+0

Davidありがとうございます。正直言って、私はこれらのオブジェクトも使い捨てになるとは考えられません。それらを処分しない限り、親オブジェクトが常に使い捨てオブジェクトを処分すると想定するのは安全ですか?私はそれがどれほど快適であるかわからない。 –

+0

このページはレンダリング後にコントロールを破棄します。 –

+0

Pageオブジェクトはすべてのコントロールを破棄しますか?誰かがそれのためのリンクを持っていますか? thx –

関連する問題