宠物店 4.0 中 ICloneable 接口的疑问

本文关键字:接口 ICloneable 宠物店 | 更新日期: 2023-09-27 17:47:21

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

宠物店 4.0 中 ICloneable 接口的疑问

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

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

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