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

È stato utile?

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ò.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top