Contexte:Faire un objet géré vraiment supprimables
J'ai essayé de poser this question yesturday mais sans véritable conclusion, donc je pensais que je voudrais essayer de demander d'une manière différente que ce problème me cause un grand mal de tête .
Mon application est un outil de conception IHM intégré. Cela permet à l'utilisateur (qui est un développeur interne) de concevoir visuellement l'apparence de l'IHM intégrée et, ensuite, en cliquant sur un bouton, de générer le code C. La plupart de cela fonctionne maintenant.
L'un des principaux avantages de l'outil est qu'il permet à l'utilisateur de créer de nouveaux écrans (qui peuvent alors contenir des contrôles). Dans mon application, un «écran» est un objet. Quand un nouvel écran est ajouté, il est placé dans un List<Screen>
qui est ensuite utilisé pour générer le code C.
L'une des propriétés de cet écran est le private Screen nextScreen
qui est une référence à un autre objet d'écran qui indique quel écran afficher ensuite lorsque le bouton de navigation est enfoncé. Encore une fois tout cela fonctionne très bien.
Problème:
Cependant, lors de la lecture avec l'outil pour générer du code nous avons trouvé un problème. 2 écrans ont été créés, le premier écran ayant sa propriété nextScreen
définie sur le 2ème. Un peu plus tard, il a été décidé que le deuxième écran était erroné, donc il a été supprimé et un nouvel écran a été créé. Cependant, ils ont oublié de définir la propriété nextScreen
du premier écran sur ce nouvel écran, donc il faisait toujours référence à l'écran d'origine qui, visuellement, avait été supprimé.
Lorsque le code a été généré, le code C résultant n'a pas pu être compilé car le premier écran faisait référence à un écran qui, dans l'environnement C généré, n'existait pas.
Question:
Alors ma question est de savoir comment puis-je mettre en œuvre une meilleure façon de supprimer ce qui garantit que tout ce qui fait référence à un objet « supprimé » le sait et définit cette propriété sur null?
Pensées à ce jour:
1) J'ai essayé de créer la propriété « nextScreen » comme WeakReference qui fonctionne, mais cela signifie que je dois appeler manuellement le GC.Collect() chaque fois qu'un effacement est fait ... pas idéal de ma compréhension! (Mon exemple d'essayer ceci peut être trouvé dans le lien en haut de ce billet)
2) Je pourrais, après suppression, vérifier tous les objets pour une référence à celui qui est supprimé et le mettre à null. Cependant, ce que j'ai décrit ci-dessus n'est que l'un des nombreux objets composant l'IHM, dont la plupart ont une ou plusieurs références à d'autres objets. Donc, cela pourrait être lent et dans mon esprit ne semble pas juste.
3) Peut-être utiliser IDisposable ??? mais à ma connaissance, c'est pour le code non géré!
Toutes les idées ou les domaines pour que je puisse lire sur ce serait génial car je suis en train de me tirer les cheveux sur ce ... pas que j'ai beaucoup !!!
Merci pour la suggestion que j'ai examinée, mais cela ne fournit pas vraiment la fonctionnalité dont j'ai besoin comme décrit ci-dessus. J'ai continué à enquêter et suis arrivé à la conclusion qu'il n'y a vraiment rien pour mon but, qui me supprime vraiment. Je suis donc en train de mettre en place ma propre classe de gestionnaire et une interface de support que je publierai une fois terminée. – TheGrovesy