| hephaestos |
el muchacho a écrit :
En fait, quels sont les cas d'utilisation de Dispose() ?
Si tu dois libérer immédiatement la ressource, parce qu'elle doit être utilisée par ailleurs (un fichier "totoz" écrit par toi et écrit/lu par un autre processus, par ex), je pense qu'il vaut largement mieux faire un close()/unlock() et garder le handle sur le fichier. C'est bien plus rapide que de faire à chaque fois une allocation (qui in fine va faire un appel système pour obtenir le handle du fichier) puis un Dispose() à chaque fois que tu veux ouvrir et écrire à nouveau le fichier. C'est une gestion manuelle, mais c'est vrai aussi en C++. Sinon, effectivement, si tu fais des new File("totoz" ) à tire larigot en laissant le GC s'épuiser à les fermer un à un, tu vas occuper des milliers de handles de fichiers, là où en C++ le RAII nettoie proprement derrière lui.
Idem pour la gestion de sockets.
Si tu fais juste une seule ouverture/fermeture du fichier, tu t'en fous que le GC soit non déterministe. Tu fais ton close() à la fin et basta.
Au final, Dispose(), le cas d'utilisation que je vois, c'est si il y a un besoin urgent de faire un nettoyage quand le GC n'a pas pu passer. Ce sont vraiment dans des applications très spécifiques où les perfs sont critiques (auquel cas de toute façon, la question se pose si le C++ n'est pas plus approprié). Perso je n'ai jamais eu à l'utiliser.
|
el muchacho a écrit :
Je ne pas dit que c'était plus rapide. En fait j'ai dit exactement le contraire mais j'ai eu la flemme de détailler ce qui me semblait évident.
Sinon ce que tu dis est vrai, mais ça n'est en rien différent du C++, d'un côté tu implémentés IDisposeable, de l'autre tu écris un destructeur. Le pb d'Hepha c'est pas tant ce qui doit être fait, mais quand le nettoyage doit être exécuté.
Edit: effectivement, le RAII à un léger avantage ici parce que le nettoyage de l'objet Parent est bloqué même si un close a été effectué, mais en pratique, ça n'arrive pas souvent que ça pose un réel pb
|
Déjà un objet Disposable, on doit le disposer, c'est la philosophie du truc. Je te fournis une interface facile à utiliser, tu l'utilises, point. Tu n'es pas sensé choisir les moments où tu l'utilises et les fois où tu comptes sur le finalizeur. Tu peux évidemment mais ce n'est pas la philosophie du concept.
Du coup au final ce qui me chiffonne c'est simplement de devoir utiliser ce pattern alors que précisément la gestion automatisée des ressources est l'un des objectifs des langages haut niveaux. Et comme ce pattern est une conséquence directe de l'existence du GC, je me posais la question de l'utilité de ce dernier, utilité qui comme tu l'as fait remarqué est moins flagrante face aux dernières versions de c++.
|