在Petshop 4.0的'DBUtility'项目中,抽象类SqlHelper有一个方法'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;
}
为什么不直接返回'cachedParms'?
答案 0 :(得分:5)
如果直接返回cachedParms,则调用者可以更改数组的元素。然后缓存的内容将被有效破坏 - 下一个使用相同缓存密钥从缓存中获取参数的调用者将获得意外结果。
编辑:克隆数组本身可以防止元素被不同的参数替换。克隆元素也可以防止参数对象发生变异。基本上它都是防御性编码。
答案 1 :(得分:0)
要添加Jon Skeet所说的内容,如果返回的Cache'd值在内部使用,那么您不希望用户使用可能在没有他们知晓的情况下更改的值。