.NET: Mise au rebut d'un objet HashAlgorithm
-
11-09-2019 - |
Question
Les objets qui dérivent de HashAlgorithm tels que MD5CryptoServiceProvider ont une méthode Dispose (), mais il est privé. Au contraire, il a une méthode claire () qui « libère toutes les ressources » utilisées par elle.
WTF?
Est-ce la façon de disposer correctement d'un HashAlgorithm alors?
var hasher = new MD5CryptoServiceProvider();
byte[] hashCode = hasher.ComputeHash(data);
hasher.Clear();
Quelqu'un veux expliquer celui-ci pour moi? :)
La solution
Recherche avec réflecteur, la méthode Clear
de HashAlgorithm
appelle simplement la méthode Dispose
privée. La raison pour exposer une méthode avec le nom Clear
était probablement juste que les concepteurs de la classe pensé que ce serait un nom plus approprié pour un algorithme de hachage. Vous voyez des styles similaires dans d'autres parties de la BCL, tels que Close
pour System.IO.Stream
. En outre, les meilleures pratiques est d'utiliser un bloc using
, qui appellera automatiquement la méthode de Dispose
privée quand il est fini.
Autres conseils
Alors que la méthode Dipose()
est privée, si vous le jeter aux IDisposable
vous pouvez y accéder. Comme d'autres l'ont dit, cependant, Clear()
appellera pour vous.
Une meilleure approche, cependant, est de joindre la déclaration et l'affectation et de la variable dans un bloc en utilisant ():
byte[] hashCode;
using(var hasher = new MD5CryptoServiceProvider())
{
hashCode = hasher.ComputeHash(data);
}
Vous devez laisser le GC gérer pour vous. C'est est le travail.
Certaines ressources doivent être éliminés, comme les connexions DB et poignées de fichiers, alors mettez les dans un bloc de using
(C #). Ce n'est pas un de ces cas, cependant.