NET: Smaltimento un oggetto HashAlgorithm
-
11-09-2019 - |
Domanda
Gli oggetti che derivano da HashAlgorithm come MD5CryptoServiceProvider hanno un metodo Dispose (), ma è privato. Invece ha un metodo Clear (), che "Rilascia tutte le risorse" utilizzate da esso.
WTF?
E 'questo come smaltire correttamente di un HashAlgorithm allora?
var hasher = new MD5CryptoServiceProvider();
byte[] hashCode = hasher.ComputeHash(data);
hasher.Clear();
Qualcuno vuole spiegare questo per me? :)
Soluzione
Guardando con Reflector, il metodo di Clear
HashAlgorithm
chiama semplicemente il metodo Dispose
privato. La ragione per esporre un metodo con nome Clear
era probabilmente solo che i progettisti della classe pensato che sarebbe stato un nome più adatto per un algoritmo di hash. Si vede stili simili all'interno di altre parti del BCL, come Close
per System.IO.Stream
. Inoltre, le migliori prassi è quella di utilizzare un blocco using
, che chiamerà automaticamente il metodo Dispose
privato quando è finito.
Altri suggerimenti
Mentre il metodo Dipose()
è privato, se la lanci a IDisposable
si può accedere ad esso. Come altri hanno già detto, però, Clear()
chiamerà per voi.
Un approccio migliore, tuttavia, consiste nel racchiudere la dichiarazione e e assegnazione della variabile in un blocco utilizzando ():
byte[] hashCode;
using(var hasher = new MD5CryptoServiceProvider())
{
hashCode = hasher.ComputeHash(data);
}
Si dovrebbe lasciare il GC manico che per te. Questo è il suo lavoro.
Alcune risorse devono essere smaltiti, come le connessioni DB e handle di file, in modo da mettere quelle in un blocco using
(C #). Questo non è uno di quei casi, però.