.NET: disponer un objeto HashAlgorithm
-
11-09-2019 - |
Pregunta
Los objetos que se derivan de HashAlgorithm como MD5CryptoServiceProvider tienen un método Dispose (), pero es privado. En cambio, tiene un método Clear () que "Libera todos los recursos utilizados" por ella.
WTF?
¿Es así como para disponer correctamente de un HashAlgorithm entonces?
var hasher = new MD5CryptoServiceProvider();
byte[] hashCode = hasher.ComputeHash(data);
hasher.Clear();
quiero alguien explicar esto a mí? :)
Solución
Mirando con reflector, el método de Clear
HashAlgorithm
simplemente llama al método Dispose
privado. El motivo de la exposición de un método con el nombre de Clear
era probablemente sólo que los diseñadores de la clase pensaron que sería un nombre más adecuado para un algoritmo de hash. Ves estilos similares en otras partes del BCL, como Close
para System.IO.Stream
. Además, la mejor práctica es utilizar un bloque using
, que se llamará automáticamente al método Dispose
privada cuando esté terminado.
Otros consejos
Mientras que el método Dipose()
es privado, si lo lanzas a IDisposable
se puede tener acceso a él. Como otros han dicho, sin embargo, Clear()
llamará por usted.
Un mejor enfoque, sin embargo, es encerrar la declaración y y asignación de la variable en un bloque utilizando ():
byte[] hashCode;
using(var hasher = new MD5CryptoServiceProvider())
{
hashCode = hasher.ComputeHash(data);
}
Se debe dejar que el GC manejar eso para usted. Ese es su trabajo.
Algunos recursos se deben tirar, al igual que las conexiones de base de datos y manipulación de archivos, por lo que ponen las de un bloque using
(C #). Este no es uno de esos casos, sin embargo.