Il n'y a rien de mal avec le code que vous avez écrit. C'est principalement parce que C#, comme n'importe quel langage .NET, est un langage "géré" qui fait beaucoup de gestion de la mémoire pour vous. Pour obtenir le même effet en C++, vous devez utiliser explicitement une bibliothèque tierce.
Pour éclaircir certaines des bases pour vous:
En C#, vous traitez rarement avec des « pointeurs » ou « références » directement. Vous pouvez traiter des pointeurs, si vous en avez besoin, mais c'est un code «dangereux» et vous évitez vraiment ce genre de choses à moins de savoir ce que vous faites. Dans les quelques cas où vous faites affaire avec des références (par exemple ref
ou out
paramètres) la langue cache tous les détails de vous et vous permet de les traiter comme des variables normales. Au lieu de cela, les objets en C# sont définis comme instances de types de référence; Chaque fois que vous utilisez une instance d'un type de référence, il est similaire à l'utilisation d'un pointeur sauf que vous n'avez pas à vous soucier des détails. Vous pouvez créer de nouvelles instances de types de références en C# de la même façon que vous créez de nouvelles instances d'objets en C++, en utilisant l'opérateur new
, qui alloue de la mémoire, exécute les constructeurs, etc. Dans votre exemple de code, les deux StringBuilder
et List<StringBuilder>
sont les types de référence.
L'aspect clé des langages managés qui est important ici est la collecte automatique de place. Au moment de l'exécution, le .NET Framework "sait" quels objets vous avez créés, car vous les créez toujours à partir de son propre tas géré en interne (pas de malloc
direct ou rien de semblable en C#). Il "sait" aussi quand un objet est complètement hors de portée - quand il n'y a plus de références à n'importe quel endroit dans votre programme. Une fois que cela se produit, le moteur d'exécution est capable de libérer la mémoire quand il le veut, généralement quand il commence à manquer de mémoire libre, et vous n'avez jamais à le faire. En fait, il n'y a aucun moyen en C# de détruire explicitement un objet géré (bien que vous ayez à nettoyer ressources non gérées si vous les utilisez).
Dans votre exemple, le moteur d'exécution sait que vous avez créé un StringBuilder
et l'avez placé dans un List<>
; il gardera la trace de cet objet, et tant qu'il sera dans le List<>
il restera collé. Une fois que vous l'avez supprimé du List<>
, ou que le List<>
lui-même s'en va, le moteur d'exécution nettoie automatiquement le StringBuilder
pour vous.
Votre code est parfaitement valide. Bizarre, mais valide. –
lol, oui c'est bizarre parce que je l'ai écrit ici :) ces fonctions fonctionnent surtout, mais j'ai besoin de savoir si elles sont en sécurité – icaptan
Huh? Ce n'est pas clair à au. C'est une manière acceptable d'ajouter StringBuilders à une liste StringBuilder, bien que le SB soit toujours vide. Peut-être que votre fonction devrait dans un paramètre pour le texte à ajouter à StringBuilder et à son tour, il l'ajoute à la liste. Vous pouvez également raccourcir ce code avec logs.Add (new StringBuilder()); – GrayFox374