Uma dúvida com a interface ICloneable em petshop 4.0?
-
05-07-2019 - |
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?
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.