在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'?
最佳答案
如果直接返回cachedParms,则调用方可以更改数组的元素。然后,缓存的内容将被有效破坏-下一个调用者使用相同的缓存键从缓存中获取参数时,将会得到意外的结果。
编辑:克隆数组本身可以防止元素被不同的参数替换。克隆元素还可以防止参数对象发生突变。基本上都是防御性编码。