NET: Eliminação de um objecto HashAlgorithm
-
11-09-2019 - |
Pergunta
Os objetos que derivam de HashAlgorithm como MD5CryptoServiceProvider ter um método Dispose (), mas é privado. Em vez disso, tem um método Clear () que "libera todos os recursos" usados ??por ela.
WTF?
É este como descartar corretamente de um HashAlgorithm então?
var hasher = new MD5CryptoServiceProvider();
byte[] hashCode = hasher.ComputeHash(data);
hasher.Clear();
Alguém quero explicar isso para mim? :)
Solução
Olhando com refletor, o método Clear
de HashAlgorithm
simplesmente chama o método Dispose
privado. A razão para expor um método com o nome Clear
foi provavelmente apenas que os designers da classe pensei que seria um nome mais adequado para um algoritmo de hash. Você vê estilos semelhantes dentro de outras partes do BCL, como Close
para System.IO.Stream
. Além disso, a melhor prática é usar um bloco using
, que irá automaticamente chamar o método Dispose
privada quando estiver terminado.
Outras dicas
Enquanto o método Dipose()
é privado, se você lançá-lo aos IDisposable
você pode ter acesso a ele. Como já foi dito, porém, Clear()
vai chamá-lo para você.
Uma abordagem melhor, no entanto, é para incluir a declaração e e atribuição da variável em um bloco usando ():
byte[] hashCode;
using(var hasher = new MD5CryptoServiceProvider())
{
hashCode = hasher.ComputeHash(data);
}
Você deve deixar a alça GC isso para você. É isso de trabalho.
Alguns recursos devem ser eliminados, como conexões de banco de dados e identificadores de arquivo, para colocar aqueles em um bloco using
(C #). Este não é um desses casos, no entanto.