在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;
}
为什么不直接返回"缓存Parms"?
如果直接返回 cachedParms,则调用方可以更改数组的元素。然后,缓存的内容将被有效地损坏 - 下一个使用相同缓存键从缓存中获取参数的调用方将获得意外结果。
编辑:克隆数组本身可防止元素被替换为不同的参数。克隆元素还可以防止参数对象发生突变。基本上都是防御性编码。
补充一下 Jon Skeet 所说的,如果返回的 Cache'd 值在内部使用,那么您不希望用户使用可能在他们不知情的情况下更改的值。