Pregunta

En el proyecto 'DBUtility' de Petshop 4.0, la clase abstracta SqlHelper tiene un método '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;
    }

¿por qué no devolver los 'cachedParms' directamente?

¿Fue útil?

Solución

Si cachedParms se devolviera directamente, el llamante podría cambiar los elementos de la matriz. El contenido de la memoria caché se corrompería efectivamente: la siguiente persona que llame a buscar los parámetros de la memoria caché con la misma clave de caché obtendría resultados inesperados.

EDITAR: la clonación de la propia matriz evita que los elementos se reemplacen con diferentes parámetros. La clonación de los elementos también evita que el parámetro objetos sea mutado. Básicamente todo es codificación defensiva.

Otros consejos

Para agregar a lo que dijo Jon Skeet, si los valores de Cacheado devueltos se usan internamente para, entonces no desea que el usuario use valores que podrían cambiar sin que ellos lo sepan.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top