2009-08-31 2 views
3

Question potentiellement embarrassante, mais il y a évidemment quelque chose qui me manque et que je veux savoir.Pourquoi l'objet parent échoue-t-il avec un objet enfant précédemment éliminé?

Je m'attends à ce que le code suivant crée une nouvelle ligne de table avec de nouvelles cellules à rendre plus tard. Et c'est ce que ça fait ... comme vous vous en doutez. Mais .... mais les TD créés dans les instructions using ne sont-ils pas invalidés une fois qu'ils sortent de la portée 'using'? Les objets TD référencés par la ligne ne seraient-ils pas invalides et la ligne ne devrait-elle pas échouer lorsqu'elle tente de les utiliser? La même chose pourrait être dite pour le TR quand il est rendu par l'objet 'tbl'.

Est-ce que je ne comprend pas?

Est-ce que je ne comprends pas l'utilisation?

Est-ce que TableRow.Cells.Add() fait réellement une copie en profondeur pas seulement une copie de ref ptr?

Le TableCell peut-il être utilisé après son élimination?

Ce qui donne?

Répondre

6

Tout le bloc "using" fait en sorte que la méthode "Dispose" de l'objet soit appelée à la fin du bloc. Les objets peuvent toujours être utilisés après avoir été éliminés, mais c'est à leur implémentation de la méthode "Dispose" de savoir si quelque chose de mauvais arrivera si cela est fait.

Dans ce cas, il ne ressemble pas à la méthode "Dispose" sur TableRow & TableCell fait tout ce qui empêche leur utilisation dans le futur. C'est pourquoi vous n'avez aucun problème.

Puisque vous voulez que les objets soient utilisés dans le futur, vous ne devriez pas les mettre du tout en "utilisant" des blocs. L'objet page parent doit disposer des contrôles à la fin du cycle de vie de la page. J'ai effectué un contrôle de serveur de test et mis un point d'arrêt dans son événement "Dispose". Voici la trace de la pile qui montre les appels .Net éliminés pour vous. Vous pouvez utiliser Reflector pour regarder le code plus en détail.

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

Merci David, pour être honnête, je ne peux pas penser à aucune raison que ces objets seraient même jetables. En ce qui concerne la non-disposition, est-il prudent de supposer que l'objet parent aura toujours des objets jetables? Je ne suis pas sûr à quel point je suis à l'aise avec ça. –

+0

La page va Disposer les contrôles après le rendu. –

+0

L'objet Page dispose-t-il tous les contrôles? Est-ce que quelqu'un a un lien pour ça? thx –

Questions connexes