Oui, il y a une fuite , en fonction de la façon dont vous définissez FUITE et de combien plus tard vous voulez dire ...
Si par fuite vous entendez "la mémoire reste allouée, indisponible pour une utilisation, même si vous avez fini de l'utiliser" et que vous entendez par la dernière fois à tout moment après avoir appelé dispose, alors oui il peut y avoir une fuite, bien que ce ne soit pas permanent (c'est-à-dire pour la durée de vie de vos applications).
Pour libérer la mémoire managée utilisée par MemoryStream, vous devez l' annuler en annulant votre référence à celle-ci, afin qu'elle devienne immédiatement éligible pour le garbage collection. Si vous ne le faites pas, vous créez une fuite temporaire à partir du moment où vous avez fini de l'utiliser, jusqu'à ce que votre référence soit hors de portée, car entre-temps la mémoire ne sera pas disponible pour l'allocation.
L'avantage de l'instruction using (par rapport à un simple appel à disposer) est que vous pouvez DÉCLARER votre référence dans l'instruction using. Lorsque l'instruction using se termine, non seulement Dispose est appelé, mais votre référence sort de la portée, annulant effectivement la référence et rendant immédiatement votre objet éligible au garbage collection sans que vous ayez à vous rappeler d'écrire le code "reference = null".
Si le fait de ne pas déférer tout de suite quelque chose n'est pas une fuite de mémoire "permanente" classique, cela a certainement le même effet. Par exemple, si vous conservez votre référence au MemoryStream (même après avoir appelé dispose), et un peu plus loin dans votre méthode, vous essayez d'allouer plus de mémoire ... la mémoire utilisée par votre flux mémoire encore référencé ne sera pas disponible jusqu'à ce que vous annuliez la référence ou qu'elle soit hors de portée, même si vous avez appelé dispose et que vous avez fini de l'utiliser.