1

在 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”?

4

2 回答 2

5

如果直接返回 cachedParms,则调用者可以更改数组的元素。然后缓存的内容将被有效地破坏——下一个使用相同缓存键从缓存中获取参数的调用者会得到意想不到的结果。

编辑:克隆数组本身可以防止元素被不同的参数替换。克隆元素也可以防止参数对象发生变异。基本上都是防御性编码。

于 2008-10-07T10:08:18.643 回答
0

补充一下 Jon Skeet 所说的,如果返回的缓存值在内部使用,那么您不希望用户使用可能在他们不知道的情况下更改的值。

于 2008-10-07T10:20:17.717 回答