Un doute avec l'interface ICloneable dans petshop 4.0?
-
05-07-2019 - |
Question
Dans le projet "DBUtility" de Petshop 4.0, la classe abstraite SqlHelper a une méthode "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;
}
pourquoi ne pas renvoyer directement les 'cachedParms'?
La solution
Si cachedParms était renvoyé directement, l'appelant pourrait alors modifier les éléments du tableau. Le contenu du cache serait alors effectivement corrompu - le prochain appelant à extraire les paramètres du cache avec la même clé de cache obtiendrait des résultats inattendus.
EDIT: Le clonage de la matrice elle-même empêche les éléments d'être remplacés par des paramètres différents. Le clonage des éléments empêche également la mutation du paramètre objets . Il s’agit essentiellement de codage défensif.
Autres conseils
Pour ajouter à ce que Jon Skeet a dit, si les valeurs renvoyées par Cache'd sont utilisées en interne, vous ne voulez pas que l'utilisateur utilise des valeurs qui pourraient changer sans que personne ne s'en aperçoive.