.NET dispose d'un collecteur d'ordures qui s'occupe du nettoyage du code. C'est pourquoi vous n'avez pas besoin (généralement) de destructeurs.
Ce qui est pertinent dans ce cas, c'est que quelque chose "disparaît" lorsque rien n'y fait référence.
Ce qui est également pertinent est ce que myHyperLink représente. myHyperLink n'est pas l'objet lui-même, c'est un pointeur à l'objet. Il existe certains types de base tels que int où ce n'est pas le cas, mais lorsque vous traitez des objets complexes, c'est ce qui se passe. Dans ce cas, vous avez donc à la fois le pointeur myHyperLink et l'objet vers lequel myHyperLink pointe. Cette distinction est très importante.
Dans votre code, nous avons l'hyperlien lui-même et le pointeur myHyperLink. L'objet hyperlien lui-même est référencé à la fois par Page.Form.Controls et votre référence locale à myHyperLink.
Quand vous avez dit
myHyperLink = newHyperLink ;
Ce que vous avez fait, c'est changer ce vers quoi le pointeur myHyperLink pointait. L'hyperlien original existait toujours dans Page.Form.Controls. Cela signifie que l'hyperlien original ne disparaît pas - il est toujours référencé.
Ensuite, pourquoi l'original était-il toujours affiché et pas le nouveau ? Eh bien, lorsque la page est rendue, elle se soucie principalement de ce qui existe dans Page.Form.Controls. Puisque la référence originale est toujours dans page.form.controls, c'est ce qui est rendu. Bien que le nouvel hyperlien existe, il n'a jamais été ajouté à Page.Form.Controls. Il a simplement été référencé par votre pointeur et manipulé. À moins que vous ne l'ajoutiez à Page.Form.Controls (ou que vous ne remplaciez manuellement le rendu ou que vous ne fassiez quelque chose de bizarre), il ne s'affichera pas.