Pergunta

Em projecto de Petshop 4.0 do 'DBUtility', a classe SqlHelper abstrato tem um 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 que não voltar dos cachedParms 'diretamente?

Foi útil?

Solução

Se cachedParms foram devolvidos diretamente, o chamador pode então alterar os elementos do array. O conteúdo do cache, então, ser efetivamente corrompido -. A próxima chamada para buscar os parâmetros do cache com a mesma chave de cache iria obter resultados inesperados

EDIT: Clonagem da própria matriz evita que os elementos a ser substituídos com diferentes parâmetros. Clonagem dos elementos bem impede o parâmetro objetos ser mutado. Basicamente, é tudo defensiva codificação.

Outras dicas

Para adicionar ao que Jon Skeet disse, se os valores Cache'd return'd são usados ??internamente para, em seguida, você não quer que o usuário esteja usando valores que podem mudar sem eles estar consciente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top