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'?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top