在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;
}
Run Code Online (Sandbox Code Playgroud)
为什么不直接返回'cachedParms'?
如果直接返回cachedParms,则调用者可以更改数组的元素.然后缓存的内容将被有效地破坏 - 下一个使用相同的缓存键从缓存中获取参数的调用者将获得意外的结果.
编辑:克隆数组本身可以防止元素被不同的参数替换.克隆元素也可以防止参数对象发生变异.基本上它都是防御性编码.