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? :)

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top