Est-il possible de faire respecter l'utilisation d'une instruction à l'aide en C #

StackOverflow https://stackoverflow.com/questions/751016

  •  09-09-2019
  •  | 
  •  

Question

voudrais vraiment pouvoir décorer ma classe avec un attribut d'une sorte qui imposerait l'utilisation d'une instruction à l'aide afin que la classe sera toujours en toute sécurité disposé et éviter les fuites de mémoire. Quelqu'un sait d'une telle technique?

Était-ce utile?

La solution

Eh bien, il y a une façon que vous pourriez sorte de le faire - ne permettre l'accès à votre objet via une méthode statique qui prend un délégué. En très exemple simplifié (comme évidemment il y a beaucoup de différentes façons d'ouvrir un fichier - lecture / écriture, etc.):

public static void WorkWithFile(string filename, Action<FileStream> action)
{
    using (FileStream stream = File.OpenRead(filename))
    {
        action(stream);
    }
}

Si les seules choses capables de créer une instance de votre objet à usage unique sont des méthodes au sein de votre propre classe, vous pouvez vous assurer qu'ils obtiennent utilisés de façon appropriée. Il est vrai qu'il n'y a rien pour arrêter le délégué de prendre une copie de la référence et d'essayer de l'utiliser plus tard, mais ce n'est pas tout à fait le même problème.

Cette technique limite considérablement ce que vous pouvez faire avec votre objet, bien sûr -. Mais dans certains cas, il peut être utile

Autres conseils

Vous pouvez utiliser FxCop pour faire respecter cette règle. Voir Wikipedia pour une aperçu rapide .

Si vous voulez vous assurer que votre objet est toujours disposé à, utiliser un finaliseur en combinaison avec IDisposable.

Mais avant de le faire, lire sur IDisposable et finaliseurs, et être conscient du fait que vous ne les avez pas besoin normalement à moins que votre classe est de faire quelque chose comme la gestion de la durée de vie d'une ressource non gérée.

Avec un finaliseur votre objet sera récupéré « éventuellement » si enveloppé dans une utilisation ou non. L'instruction à l'aide, ce qui est une commodité pour IDisposable, permet le nettoyage déterministe avoir lieu. La seule réserve est que l'objet avec finaliseurs sont plus chers pour nettoyer et en général autour de bâton en mémoire plus longtemps en attendant la finalisation.

ref Quand dois-je mettre en œuvre un ou finaliseur IDisposable? ou technorabble: Utilisation Dispose, finaliseurs et IDisposable

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top