Un dubbio con l'interfaccia ICloneable in petshop 4.0?
-
05-07-2019 - |
Domanda
Nel progetto "DBUtility" di Petshop 4.0, la classe astratta SqlHelper ha un metodo "GetCachedParameters":
public static SqlParameter[] GetCachedParameters(string cacheKey) {
SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];
if (cachedParms == null)
return null;
SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];
for (int i = 0, j = cachedParms.Length; i < j; i++)
clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();
return clonedParms;
}
perché non restituire direttamente 'cachedParms'?
Soluzione
Se sono stati restituiti direttamente cachedParms, il chiamante potrebbe quindi modificare gli elementi dell'array. Il contenuto della cache verrebbe quindi effettivamente danneggiato: il chiamante successivo per recuperare i parametri dalla cache con la stessa chiave cache otterrebbe risultati imprevisti.
EDIT: la clonazione dell'array stesso impedisce la sostituzione degli elementi con parametri diversi. Anche la clonazione degli elementi impedisce la modifica del parametro oggetti . Fondamentalmente è tutto codice di difesa.
Altri suggerimenti
Per aggiungere a ciò che ha detto Jon Skeet, se i valori della cache restituiti vengono utilizzati internamente, non si desidera che l'utente utilizzi valori che potrebbero cambiare senza che se ne accorgano.